Задать вопрос

В nodejs цикл foreach асинхронный?

Получаю цену предметов в Steam. Предметпока один. Код примерно такой
console.log("Call result: " + checkPrice(items));

function checkPrice(items) {
	var price = 0;
	items.forEach(function(item, index, array) {
		market.getItemsPrice(730, item.market_hash_name, function(data) {
			price = price + parseFloat(data[item.market_hash_name].lowest_price.replace("$",""));
			console.log("Function result: " + price);
		});
	});
	return price;
}

Результат (порядок вывода сохранен):

Call result: 0
Function result: 0.06

Пробовал уже return засовывать в foreach, тогда Call result будет undefined. Такое впечатление, что функция checkPrice вообще не дожидается окончания выполнения foreach. На каком этапе я ступил?

UPD:
Items есть. Содержание такое:
[ { appid: 730,
classid: '310776773',
instanceid: '302028390',
currency: false,
background_color: '',
icon_url: '-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KU0Zwwo4NUX4oFJZEHL
bXH5ApeO4YmlhxYQknCRvCo04DEVlxkKgpot6-iFBRw7P7NYjV96tOkkZOfqPH9Ib7um25V4dB8xLuVo
IqkiVHtrkFoMGjzdoSWdwY6aFvX_Vfow-_mhJS5vs_IwHRhuyk8pSGK2gnD2Gc',
icon_url_large: '-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KU0Zwwo4NUX4o
FJZEHLbXH5ApeO4YmlhxYQknCRvCo04DEVlxkKgpot6-iFBRw7P7NYjV96tOkkZOfqPH9Ib7um25V4dB
8teXA54vwxgbg_hVtMjz6cYSRIQc-M1rT_1G6yO3ogpDqvpzAyHBmuHIj7HnfnhypwUYb6FJ3cHs',
descriptions: [ [Object], [Object], [Object], [Object], [Object], [Object] ]
,
tradable: true,
actions: [ [Object] ],
name: 'AUG | Condemned',
name_color: 'D2D2D2',
type: 'Industrial Grade Rifle',
market_name: 'AUG | Condemned (Field-Tested)',
market_hash_name: 'AUG | Condemned (Field-Tested)',
market_actions: [ [Object] ],
commodity: false,
market_tradable_restriction: 7 } ]
  • Вопрос задан
  • 1859 просмотров
Подписаться 4 Оценить 2 комментария
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Промисы в помощь:
checkPrice(items).then(console.log.bind(console, "Call result: "));

function checkPrice(items) {
  return Promise.all(items.map(function(item, index, array) {
    return new Promise(function(resolve) {
        market.getItemsPrice(730, item.market_hash_name, function(data) {
          var price = parseFloat(data[item.market_hash_name].lowest_price.replace("$",""));
          resolve(price);
          console.log("Function result: " + price);
        });
    });
  })).then(function(prices) {
    //сумма всех полученных цен
    return prices.reduce(function(result, price) {
        result += price;
        return result;
    }, 0);
  });
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@r_zaycev
market.getItemsPrice()
асинхронный, судя по коду.
Ответ написан
Комментировать
@timfcsm
market.getItemsPrice асинхронный
Ответ написан
Комментировать
amf1k
@amf1k
А items то есть?
Ответ написан
Комментировать
@LiguidCool
Мм, почему мне кажется, что вы вызываете функцию, когда items еще не получен?
function checkPrice(items) {
console.log(items);
//////////
}

Просто это банальная ошибка в таких ситуациях.
А вообще да - наверное промисы.
Ответ написан
Ваш ответ на вопрос

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

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