如何将第一个promise的返回值传递给链式promise中的最后一个

时间:2017-05-05 14:36:38

标签: javascript es6-promise

我有一个令人困惑的问题:

我正在使用promise chain来调用几个函数,如下所示:

 CommonPromiseLists.checkStatusPromise().then(CommonPromiseLists.getChannelPreferencePromise).then(CommonPromiseLists.getChannelsPromise).then(getUniqueStory.bind(null, storyId))

如您所见,函数被调用,我得到了正确的结果。但是,根据最近的需求更改,我需要将CommonPromiseLists.checkStatusPromise()的返回值传递给getUniqueStory.bind(null,storyId),这是我调用的最后一个promise。我有一个解决方案:所以每当我返回并将返回的值交给下一个promise时,我也可以包含第一个promise的返回值。但我相信应该有一个更简单的方法。有没有更好的方法我可以获取checkStatusPromise()的返回值并将其传递给getUniqueStory.bind(null,storyId,第一个promise的返回值)?

3 个答案:

答案 0 :(得分:2)

你可以通过promise链传递结果,但这会使代码紧密耦合,要求后续的回调预测一个奇怪的结构作为已解析的值。

使用普通承诺,更简单的方法是将其余操作包含在checkStatusPromise回调中。这样,checkStatusPromise的结果就会曝光。

CommonPromiseLists.checkStatusPromise().then(res => {
  return CommonPromiseLists.getChannelPreferencePromise(res)
    .then(CommonPromiseLists.getChannelsPromise)
    .then(getUniqueStory.bind(null, storyId, res)) // access res
});

如果你可以使用async-await,它就会变得容易一些:

async enclosingFunction(){
  const status = await CommonPromiseLists.checkStatusPromise();
  const channelPreference = await CommonPromiseLists.getChannelPreferencePromise(status);
  const channels = await CommonPromiseLists.getChannelsPromise(channelPreference);
  const uniqueStory = await getUniqueStory.bind(null, storyId, res)
  return uniqueStory;
}

enclosingFunction().then(value => /* results */)

答案 1 :(得分:1)

承诺可能不是你需要在这里使用的。看起来你需要一个生成器或async / await。我会在这里使用async / await,因为它可能更容易理解。

想象一下,你有一个返回这样的承诺的函数

function double(someVal) {
    return new Promise(resolve => {
        setTimeout(() => {
          resolve(someVal * 2);
        }, 2000);
      });
}

您可以像这样使用async / await

async function sumMultiplications() {
    var a = await double(5);
    var b = await double(20);
    var c = await double(a);
    return a + b + c;
}
  

当调用异步函数时,它返回一个Promise。当异步时   函数返回一个值,Promise将被解析   返回值。当异步函数抛出异常或某些异常时   价值,承诺将以抛出的价值被拒绝。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

答案 2 :(得分:0)

如果您需要,只需保存结果:

let res;
func1().then(result=>{
    res = result;
    return func2();
})
.then(func3)
.then(func4)
...
then(result=>{
  ...
  return res; //return result that you save as result of the first promise
})
.catch(err=>{
  throw err;
})

如果你想省略一些步骤,你可以这样做:

let res;

func1().then(result=>{
    res = result;
    if(res) //you check of the result
       return func2().then(func3);
    else 
       return func4();
})
then(result=>{
  ...
  return res; //return result that you save as result of the first promise
})
.catch(err=>{
  throw err;
})