Как после выполнения forEach вызывать callback?

Как после выполнения forEach вызывать callback?

То есть я прошел весь массив и после выполнил определенное действие, а то у меня выходит, что код начинает выполнятся дальше, а мне нужно синхронное выполнение.
items.forEach(function(item) {
                    var newItem = new Item();
                    newItem.name = item.name;
                    newItem.icon_url =  item.icon_url;
                    newItem.icon_url_large =  item.icon_url_large;
                    newItem.type =  item.type;    
                                
                    community.getMarketItem(item.appid, item.market_hash_name, function(err, item) {
                        if(err) throw err;
                        newItem.lowestPrice = item.lowestPrice;
                        logger.info('Get price');
                        newItem.save(function(err) {
                            if(err) throw err;
                            logger.info(' New Item saved!');
                        });
                    });

                    newBet.item.push(newItem);
                });
                // нужно чтобы этот код выполнялся после цикла 
                newBet.save(function(err) {
                    if(err) throw err;
                    logger.info(' New Bet saved!');
                });
  • Вопрос задан
  • 2898 просмотров
Решения вопроса 2
Staltec
@Staltec
Node.js разработчик
Для этих целей используйте библиотеку async. В частности async.each(arr, iterator, [callback]).
Ответ написан
@Kogan4ik Автор вопроса
Вот рабочий код, если кому нужно будет.
 async.each(items, function(item, callback){
                    var newItem = new Item();
                    newItem.name = item.name;
                    newItem.icon_url =  item.icon_url;
                    newItem.icon_url_large =  item.icon_url_large;
                    newItem.type =  item.type;    
                                
                    community.getMarketItem(item.appid, item.market_hash_name, function(err, item) {
                        if(err) throw err;
                        newItem.lowestPrice = item.lowestPrice;
                        logger.info('Get price');

                        newItem.save(function(err) {
                            if(err) throw err;
                            logger.info(' New Item saved!');
                            newBet.item.push(newItem);
                            callback();
                        });
                    });
                }, function(err) {
                    newBet.save(function(err) {
                        if(err) throw err;
                        logger.info(' New Bet saved!');
                    });
                });
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
forEach cинхронен
[1,2,3].forEach(function(item){
  console.log(item)
});
console.log(4)
//1 2 3 4

update:
Ты используешь в цикле асинхронные функции. Можно заменить forEach на map, собрать массив промисов и написать что-то типа Promise.all(promises).then(function(){/*код далее*/});
Ответ написан
DangelZM
@DangelZM
var resultHolder = document.querySelector('#result');
var result = '';

[1,2,3,4,5].forEach(function(item, index, arr) {
	result += index + ':' + item + '<br>';
    if(index === arr.length-1) 
        resultHolder.innerHTML = result;
});

Пример тут
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы