在promise chain nodejs中传递数据

chu*_*Dub 0 javascript node.js promise

我有一系列承诺,第一个从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);
Run Code Online (Sandbox Code Playgroud)

如何更改我的代码以将数据从第一个承诺传递到第二个承诺?

Fel*_*ing 5

你总是reject承诺:

if (err)
  console.log(err);
reject(err); // This line is always executed
if (!err)
  resolve(response); //response is an array
Run Code Online (Sandbox Code Playgroud)

这会导致.catch回调被触发(.catch((err) => { console.log('error'); })),它不会返回任何内容,因此balanceArray也是如此undefined.

首先确保在出现错误时拒绝承诺:

if (err) {
  console.log(err);
  reject(err);
}
Run Code Online (Sandbox Code Playgroud)

其次,要么重新抛出.catch回调中的错误,要么将其完全删除,然后赶上顶层:

getBalancePromise()
  .then(updateBalancePromise)
  .catch(...);
Run Code Online (Sandbox Code Playgroud)