2017-07-30 53 views
2

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帐户= data.params)访问块中创建的帐户对象,但我得到一个参考错误说它没有定义。现在,我可以通过将整个对象发送到accounts.store函数并在完成时解析对象来轻松绕过此操作,但对于更大的问题,这似乎是一个肮脏的解决方法。有没有更干净的方法来做到这一点?

回答

1

accountundefined在第二.then(),使用data引用Promiseaccounts.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}); 
}) 
+0

是什么让你认为'store'返回'account'一个(用于许诺)之后,你可以只返回帐户? – Bergi

+0

@Bergi _“是什么让你觉得商店返回(承诺)的帐户”_不确定你的意思?答案的要点是,如果OP需要访问前一个'.then()'中的值,则前面的'.then()'返回的值是后续的.then()'中的参数。 OP需要确保他们在后续的'.then()' – guest271314

+0

返回正确的值,但是他们'返回accounts.store(...)'而不是'account',所以这不太容易。 – Bergi

1

您可以创建变量返回(并将其设置在允诺)的主要功能,或者您可以返回此作为第一个承诺的结果而不是函数的结果store

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

+0

第一个提出的解决方案在承诺背景下是危险的。当函数'store'返回promise时,承诺链将被破坏。 – hsd

+0

您需要使用'Promise.all'来确保数组中的所有promise都在等待 – Bergi