Создать массив обещаний - PullRequest
0 голосов
/ 09 мая 2018

У меня есть массив монет, который я получаю из запроса к базе данных. Я передаю этот массив функции, которая должна выполнить вызов API для каждой монеты, чтобы получить значение.

Цикл FOR, подобный приведенному ниже, приведет к: (

)

// for (let i =0; i <= coins.length-1; i++){
//             console.log(i);
//              await (this.coinRepository.getActiveCoinAsync(i.coinName)
//                 .then(response => {
//                     // console.log((response[0].price_eur))
//                     // console.log((result[i].amount))
//                     // console.log( value +(response[0].price_eur) * (result[i].amount))
//
//                     value = value +((response[0].price_eur) * (i.amount))
//                     console.log(value)
//
//                 })
//                 .catch(error => reject(error))
//             )
//         }

Результат:

console.log(i)
console.log(i)
console.log(i)
value
value
value

Я попробовал это ниже, но, похоже, он не выполняет никаких обещаний:

return new Promise((resolve, reject) => {
let value = 0;
let promises =[];
for (let i =0; i <= coins.length-1; i++){
    let promise =  (this.coinRepository.getActiveCoin(coins[i].coinName))
    promises.push(promise);
    console.log(promise);
}
console.log(promises);
Promise.all(promises)
   .then(results =>{
        console.log(results);
    })
   .catch(error => reject(error))

coinRepository.getActiveCoin

    getActiveCoin(coin) {
    return new Promise((resolve, reject) => {
        console.log(coin)
        request('https://api.coinmarketcap.com/v1/ticker/'+coin+'/?convert=EUR', function (error, response, body) {
            if (!error && response.statusCode == 200) {
                resolve (JSON.parse(body));
            }else {
                reject(error);
            }
        })

    });
}

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Ваш код выглядит нормально. Все будет решено, если в коде, который вы нам не показали, есть ошибка.

В частности, .catch(error => reject(error)) выглядит подозрительно, потому что reject нигде не определено.

Я упростил ваш код ниже, он работает как положено.

let i = 0;

function getActiveCoin(coin) {
  console.log(`getActiveCoin("${coin}")`);
  return new Promise((resolve, reject) => {
    resolve(`${coin} ${++i}`);
  });
}

let coins = [{
  coinName: "Bitcoin"
}, {
  coinName: "Stellar"
}];
let value = 0;
let promises = [];
for (let i = 0; i <= coins.length - 1; i++) {
  let promise = getActiveCoin(coins[i].coinName)
  promises.push(promise);
}
console.log('Promise.all');
Promise.all(promises)
  .then(results => {
    console.log(results);
  })
0 голосов
/ 09 мая 2018

Я предполагаю, что при вызове reject отклонения не существует, что приводит к ошибке, которая никогда не вызывается. Возможно, вы имели в виду:

let value = 0;
let promises = [];
for (let i =0; i <= coins.length-1; i++){
  let promise = this.coinRepository.getActiveCoin(coins[i].coinName)
  promises.push(promise);
}

Promise.all(promises)
    .then(results => console.log(results))
    .catch(error => console.error(error))

Редактировать 1: вы явно не отклоняете ошибку в getActiveCoin(coin): это означает, что если вы получите ошибку, ваше обещание никогда не разрешится.

 return new Promise((resolve, reject) => {
    request('https://api.coinmarketcap.com/v1/ticker/'+coin+'/?convert=EUR', function (error, response, body) {
        if (error || response.statusCode != 200) {
            return reject()
        }

        resolve (JSON.parse(body));
    })
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...