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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于链接es6 Promises,然后()和价值消费相关的知识,希望对你有一定的参考价值。

这与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会以这种方式工作,如果有更多的警告要使用它们?

答案

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

是。

我为什么每次都能改变这个价值?

因为每个.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实现的值相同。

另一答案

您使用.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)
})

以上是关于关于链接es6 Promises,然后()和价值消费的主要内容,如果未能解决你的问题,请参考以下文章

ES6 Promises

带有 ES6 Promises 的 jQuery ajax

ES6 Promises - 类似 async.each 的东西?

Promisifying xml2js 解析函数(ES6 Promises)

[Node.js] Testing ES6 Promises in Node.js using Mocha and Chai

如何动态地向promises链添加新的承诺