我正在尝试构建一个对象数组并将其发送到客户端。问题是由于异步代码(或者我正在学习(,发送的数组是空白的。
我希望循环构建数组,然后将响应从服务器发送到客户端。我被告知承诺是最好的方法,但我无法理解如何实施。承诺在这里会是什么样子?
var rates = [];
for (var i = 0, len = cryptoxArray.length; i < len; i++) {
cryptoxArray[i].getRate({
pair: "XBT_USD"
}, function(err, rateResponse) {
if (!err)
rates.push(rateResponse);
});
//I want this last part to wait until the array has been built so
//the array is '[object][object]'
console.log('rates: ' + rates); // now is outputting 'rates: []'
return res.json(rates);
正如你指定的承诺
Promise.all(cryptoxArray.map(function (cryptox) {
return new Promise(function (resolve, reject) {
return cryptox.getRate({ pair: "XBT_USD" }, function (err, rateResponse) {
return err ? reject(err) : resolve(rateResponse);
});
});
})).then(function (rates) {
return res.json(rates);
});
或在 Ultra ES2015 中
Promise.all(cryptoxArray.map(cryptox =>
new Promise((resolve, reject) =>
cryptox.getRate({ pair: "XBT_USD" }, (err, rateResponse) =>
err ? reject(err) : resolve(rateResponse)
)
)
))
.then(rates=> res.json(rates));