创建承诺数组

时间:2018-05-09 00:08:00

标签: node.js promise

我有一系列硬币,我从数据库查询中获取。我将此数组传递给一个函数,该函数需要为每个硬币执行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 :(得分:0)

我的猜测是,当你调用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));
    })
  })

答案 1 :(得分:0)

您的代码看起来很好。除非您没有向我们展示过代码中的错误,否则一切都将得到解决。

特别是,.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);
  })