spi*_*tus 294 javascript promise angularjs q
有什么区别:
new Promise(function(res, rej) {
res("aaa");
})
.then(function(result) {
return "bbb";
})
.then(function(result) {
console.log(result);
});Run Code Online (Sandbox Code Playgroud)
还有这个:
new Promise(function(res, rej) {
res("aaa");
})
.then(function(result) {
return Promise.resolve("bbb");
})
.then(function(result) {
console.log(result);
});Run Code Online (Sandbox Code Playgroud)
我问我使用Angular和$ http服务与链接.then()有不同的行为.有点太多的代码因此首先是上面的例子.
Hri*_*shi 129
规则是,如果then处理程序中的函数返回一个值,则promise使用该值解析/拒绝,如果函数返回一个promise,则会发生什么,next then子句将是函数返回的promise的then子句所以,在这种情况下,第一个例子落在正常的序列中,并按照人们的预期打印出值,在第二个例子中,当你这样做时返回的promise对象是在链接时被调用的(出于所有意图和目的).它的实际工作方式将在下面更详细地描述.thensPromise.resolve("bbb")then
引用Promises/A +规范:
promise解析过程是一个抽象操作,它将promise和value作为输入,我们将其表示为
[[Resolve]](promise, x).如果x是一个卑鄙的,它会尝试在x假设至少有点像承诺的情况下承诺采用状态x.否则,它履行了价值的承诺x.对thenables的这种处理允许promise实现进行互操作,只要它们公开符合Promises/A +的方法即可.它还允许Promises/A +实现使用合理的方法"同化"不一致的实现.
这里要注意的关键是这一行:
如果
x是承诺,采用其状态 [3.4]
JLR*_*she 90
你的两个例子都应该表现得非常相似.
then()处理程序内返回的值将成为从该返回的promise的解析值then().如果在.then promise中返回的值是promise,则返回的promise then()将"采用该promise的状态"并解析/拒绝,就像返回的promise一样.
在第一个示例中,您将返回"bbb"第一个then()处理程序,因此"bbb"将传递给下一个then()处理程序.
在第二个示例中,您将返回一个立即使用该值解析的promise "bbb",因此"bbb"将传递给下一个then()处理程序.(Promise.resolve()这里是无关紧要的).
结果是一样的.
如果您能向我们展示一个实际表现出不同行为的示例,我们可以告诉您为什么会发生这种情况.
Ari*_*sta 88
简单来说,在then处理函数内部:
A)什么时候x是一个值(数字,字符串等):
return x 相当于 return Promise.resolve(x)throw x 相当于 return Promise.reject(x)B)什么x是已经结算的承诺(不再等待):
return xreturn Promise.resolve(x)如果承诺已经解决,则相当于.return xreturn Promise.reject(x)如果承诺已被拒绝,则相当于.C)什么x是未决的承诺:
return x将返回一个待处理的Promise,并将在后续评估then.在Promise.prototype.then()文档中阅读有关此主题的更多信息.
Ben*_*aum 49
你已经得到了一个很好的正式答案.我想我应该加一个简短的.
以下内容与Promises/A +承诺相同:
Promise.resolve(在你的Angular案例中$q.when)new $q.then回调中返回一个值.所以以下对于promise或普通值X都是相同的:
Promise.resolve(x);
new Promise(function(resolve, reject){ resolve(x); });
Promise.resolve().then(function(){ return x; });
Promise.all([x]).then(function(arr){ return arr[0]; });
Run Code Online (Sandbox Code Playgroud)
并且毫不奇怪,Promises规范基于Promise Resolution Procedure,它可以实现库之间的轻松互操作(如$ q和本机承诺),让您的生活更轻松.只要可能发生承诺解决,就会出现解决方案,从而产生整体一致
| 归档时间: |
|
| 查看次数: |
185453 次 |
| 最近记录: |