将值从一个承诺传递到下一个承诺

时间:2017-07-30 15:13:07

标签: javascript node.js callback promise

javascript有点新鲜。 处理承诺,然而遇到了一个我不知道如何接近的问题。

如何将值传递给下一个承诺解析?

这是我的代码

bot.on('ask.add_account_password', (msg) => {
    let username = users[msg.from.id].username;
    let password = msg.text;
    var accounts = require('./inc/account.js');
    accounts.login_account(username,password).then(function(data){
        var account = data.params;
        console.log(account);
        return accounts.store(msg.from.id,username,password,account.followerCount);
    }).then(function(data){
        let caption = "Your account "+account.username+"("+account.fullName+")has been added\n";
        return bot.sendPhoto(msg.from.id, account.picture, {caption:caption});
    })
    .catch(function(error){
        console.log(error);
        add_account(msg,error.name);
    });
});

在我创建标题变量的行上,我正在尝试访问在它之前的块中创建的帐户对象(var account = data.params)但是我得到一个引用错误,说明它未定义。现在我可以通过将整个对象发送到accounts.store函数并让它在完成后解析对象来轻松绕过这一点,但这似乎是一个更大问题的肮脏的解决方法。有更清洁的方法吗?

3 个答案:

答案 0 :(得分:1)

accountundefined.then(),使用data引用之前Promise返回的accounts.store.then()

.then(function(data) {
  // `data` : `accounts.store` returned from previous `.then()`
  let caption = "Your account " + data.username 
                + "(" + data.fullName + ")has been added\n";
  return bot.sendPhoto(msg.from.id, data.picture, {caption:caption});
})

答案 1 :(得分:1)

您可以在main函数中创建变量(并在promise中设置),或者您可以将此作为第一个promise的结果而不是函数store

的结果返回

答案 2 :(得分:0)

您可以在数组中传递它,并在参数中使用destructuring来解压缩数组。

accounts.login_account(username,password).then(function(data){
    var account = data.params;
    console.log(account);
    return [account, accounts.store(msg.from.id,username,password,account.followerCount)];
}).then(function([account, data]){
    let caption = "Your account "+account.username+"("+account.fullName+")has been added\n";
    return bot.sendPhoto(msg.from.id, account.picture, {caption:caption});
})

您实际上似乎没有使用data,因此您可以在致电store后退回帐户