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