承诺内部承诺:从子承诺中返回变量的正确方法是什么?(JS)

Val*_*lli 39 javascript promise

我有这样的功能:

function top() {

  //promise1
  ParentPromise({
    ...some code here...
  }).then(function() {


    //promise2
        ChildPromise({
          ..some code here...
        }).then(function(response) {
         var result = response.result.items;

        });

});

};
Run Code Online (Sandbox Code Playgroud)

我需要以这种方式返回结果值:

var myresult = start();
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?谢谢

Kat*_*314 34

承诺的定义是你不能真正地分配resultmyresult.但是,您可以做出myresult直接解析result为调用者的承诺,但是许多承诺被用来实现.基本思想是在上面的块中的每个函数内部,你应该是return链中的下一个Promise.例如:

function top() {

  //promise1
  return ParentPromise({
    ...some code here...
  }).then(function() {


    //promise2
        return ChildPromise({
          ..some code here...
        }).then(function(response) {
         var result = response.result.items;
         return result;

        });

});

};
Run Code Online (Sandbox Code Playgroud)

最后,代码调用top()将不知道或关心1,2或12个链式承诺被用于获取result.它还能够在任何承诺失败的情况下注册错误回调.


Eri*_*wan 20

不太确定这是否适用于原生JS承诺,但是PromiseKit(快速...我知道,但我很确定这应该有用)我习惯于返回第二个承诺,并将其链接如下:

function top() {
  //promise1
  return ParentPromise({
    ...some code here...
  }).then(function() {
    //promise2
    return ChildPromise({
          ..some code here...
    })
  }).then(function(response) {
    var result = response.result.items;
    // do something with `result`

    return result;
  });
}

top().then(function(result){
  // all done 
});
Run Code Online (Sandbox Code Playgroud)

或者用ES6/lambda表示法;

function top() {
  return ParentPromise().then(_ => {
    return ChildPromise()
  }).then(response => {
    return response.result.items
  })
}

top().then(items => {
  // all done 
})
Run Code Online (Sandbox Code Playgroud)

  • 是的,JavaScript Promises 就是这样工作的。恕我直言,你是最好的解决方案。 (2认同)