我有一系列承诺,第一个从API获取数据,第二个承诺将数据插入数据库。
我正在尝试将数据从第一个承诺传递到第二个承诺,但它是未定义的。
这是我的代码:
var getBalancePromise = function() {
var promise = new Promise(function(resolve, reject) {
poloniexExchange.getBalance({
account: 'all'
}, function(err, response) {
if (err)
console.log(err);
reject(err);
if (!err)
resolve(response); //response is an array
});
}).catch((err) => {
console.log('error');
})
return promise;
};
var updateBalancePromise = function(balanceArray) //balanceArray undefined. This should be the data from the first promise in the chain.
{
var promise = new Promise(function(resolve, reject) {
balanceArray.data.forEach(function(element) {
db.collection('balances').update({
currency: element.currency
}, {
$set: {
amount: element.amount,
shortname: element.shortName
}
}, {
upsert: true
});
});
resolve(true);
console.log('balances updated into database');
});
return promise;
};
getBalancePromise()
.then(updateBalancePromise);
如何更改我的代码以将数据从第一个承诺传递到第二个承诺?
答案 0 :(得分:5)
你总是reject
承诺:
if (err)
console.log(err);
reject(err); // This line is always executed
if (!err)
resolve(response); //response is an array
这会导致.catch
回调被触发(.catch((err) => { console.log('error'); })
)并且不会返回任何内容,因此balanceArray
为undefined
。
首先确保在出现错误时拒绝承诺:
if (err) {
console.log(err);
reject(err);
}
其次,要么重新抛出.catch
回调中的错误,要么将其彻底删除,然后赶上顶层:
getBalancePromise()
.then(updateBalancePromise)
.catch(...);