在promise chain nodejs中传递数据

时间:2017-05-24 15:04:16

标签: 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);

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

1 个答案:

答案 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'); }))并且不会返回任何内容,因此balanceArrayundefined

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

if (err) {
  console.log(err);
  reject(err);
}

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

getBalancePromise()
  .then(updateBalancePromise)
  .catch(...);