关于链接es6 Promises,然后()和价值消费

时间:2018-03-02 13:47:32

标签: javascript ecmascript-6 promise es6-promise

这与Chaining .then() calls in ES6 promises ...

紧密相连

我尝试了一些构成承诺链的函数,基本上是这样的:

var PromiseGeneratingMethod = function(){
  return p = new Promise((resolve, reject) =>{
    resolve(1)
  });
}

var inBetweenMethod = function(){
  return PromiseGeneratingMethod()
    .then((resolved) => {
    if(resolved){
      console.log('resolved in between');
      //return resolved
        /* this changes output to
        resolved in between
        resolved at last*/
    }else{
      console.log('something went terribly wrong in betweeen', resolved);
    }
  });
}

inBetweenMethod().then((resolved) =>{
  if(resolved){
    console.log('resolved at last')
  }else{
    console.log('something went terribly wrong', resolved);
  }
})

/* ouput: 
resolved in between
something went terribly wrong undefined*/

我不明白为什么会这样。没有Promise只有一个相关的返回值?我为什么每次都能改变这个价值?这对我来说似乎是不合理的。一个Promise对象只能有一个返回值,我认为每个处理程序在Promise解析后都会收到相同的参数?

这样,有两个方法在同一个Promise上调用then(),后一个(在异步环境中你永远不知道那是什么......)总是得到一个空结果,除非每个都返回所需的价值

如果我做对了,唯一的好处就是你可以构建一个then()。then()。then()链来使它几乎同步(通过在每个then()中返回任意值)但你仍然可以用嵌套的Promises实现相同的效果,对吧?

有人可以帮助我理解为什么es6 Promises会以这种方式工作吗?如果有更多的警告要使用它们吗?

2 个答案:

答案 0 :(得分:3)

  

只有一个相关的返回值没有承诺吗?

  

为什么我可以在每次更改该值?

因为每次.then()调用都会返回承诺。

  

有两个方法在同一个Promise上调用then()

这不是你正在做的事情。您的then回调安装在不同的承诺上,这就是他们获得不同价值的原因。

可以

function inBetweenMethod() {
  var promise = PromiseGeneratingMethod();
  promise.then(resolved => { … }); // return value is ignored
  return promise;
}

但你真的应该避免这种情况。您已经注意到可以使用

获得预期的行为
function inBetweenMethod() {
  var promise = PromiseGeneratingMethod();
  var newPromise = promise.then(value => {
     …
     return value;
  });
  return newPromise;
}

使用回调返回的值解析newPromise - 可能与promise实现的值相同。

答案 1 :(得分:2)

您正在使用.then()处理程序两次,请执行以下操作:

var PromiseGeneratingMethod = function(){
  return new Promise((resolve, reject) =>{
    if (myCondition) resolve(1)
    if (!myCondition) reject("failed")
  });
}

var inBetweenMethod = function(){
  return PromiseGeneratingMethod()
}

inBetweenMethod().then((resolved) =>{
  console.log(resolved)
}).catch(function(err) {
  console.log(err)
})