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