2017-05-24 67 views
0

我有一个承诺链,第一个从API获取数据,第二个将数据插入数据库。在promise链中传递数据nodejs

我正在尝试将数据从第一个承诺传递给第二个承诺,但是它是通过未定义的。

这里是我的代码:

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'); })),它不返回任何东西,所以balanceArrayundefined

首先确保只拒绝承诺,如果有一个错误:

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

其次,无论是在.catch回调重新抛出错误或在顶层,而不是完全和捕捉其删除:

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

这就是为什么它通常最好只是牺牲卷曲的两个击键作为默认值。^_ ^; – dgeare

+0

这就是为什么你总是应该用'{}'来包装if语句 - 以避免难以发现错误。 – strah

+0

是的,我从现在开始肯定会使用括号。谢谢! – chuckieDub