有什么区别:

新承诺(函数(res, rej) { res(“aaa”); }) 不要犹豫(函数(结果){ 返回" bbb ";//直接返回字符串 }) 不要犹豫(函数(结果){ console.log(结果); });

这:

new Promise(function(res, rej) { res(“aaa”); }) .then(function(result) { 返回 Promise.resolve(“bbb”);返回承诺 }) .then(function(result) { 控制台.log(结果); });

我问,因为我得到了不同的行为使用Angular和$http服务链接.then()。代码有点多,所以首先是上面的例子。


当前回答

唯一的区别是,当您返回promise .resolve("bbb")时,您创建了一个不必要的承诺。从oncompleted()处理程序返回承诺将启动承诺解析。这就是承诺链的工作原理。

其他回答

只是一点。在调试器中,'resolve'函数不会返回。如果是最后一个语句,则返回。'Resolve'将把承诺设置为已完成,但如果下面有更多语句,则继续执行。

你可以在这里读到:“为什么javascript ES6承诺在解析后继续执行?”

这让我很困惑,因为在大多数例子中都没有解释。所以从现在开始,我必须记住使用'return resolve(value)'或'if resolve(value) else…其他代码'或只是使用'resolve'作为最后的语句。

你已经得到了一个很好的正式答案。我想我应该加一个简短的。

以下几点与Promises/A+ Promises相同:

要求的承诺。resolve(在Angular中是$q.when) 调用承诺构造函数并在其解析器中解析。在你的例子中,这是新的q。 从then回调返回一个值。 要求的承诺。都在一个有值的数组上,然后提取那个值。

因此,对于承诺值或普通值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]; });

毫无疑问,承诺规范是基于承诺解决过程的,它支持库之间的简单互操作(如$q和本机承诺),并使您的生活总体上更简单。无论何时出现承诺解决方案,解决方案都会产生整体一致性。

这两个例子的行为应该是一样的。

在then()处理程序中返回的值将成为then()返回的承诺的解析值。如果.then中返回的值是一个promise,那么then()返回的promise将“采用该promise的状态”,并像返回的promise一样解决/拒绝。

在第一个示例中,在第一个then()处理程序中返回“bbb”,因此“bbb”被传递到下一个then()处理程序。

在第二个示例中,返回一个承诺,该承诺立即用值"bbb"进行解析,因此"bbb"被传递到下一个then()处理程序。这里的Promise.resolve()是无关的。

结果是一样的。

如果你能给我们举个例子,它能表现出不同的行为,我们就能告诉你为什么会这样。

唯一的区别是,当您返回promise .resolve("bbb")时,您创建了一个不必要的承诺。从oncompleted()处理程序返回承诺将启动承诺解析。这就是承诺链的工作原理。

简单来说,在then处理函数中:

A)当x是一个值(数字,字符串等):

return x等价于return Promise.resolve(x) throw x等价于返回Promise.reject(x)

B)当x是一个已经解决的承诺(不再待定):

return x等价于return Promise.resolve(x),如果Promise已经被解析。 return x等价于return Promise.reject(x),如果Promise已经被拒绝。

C)当x是一个待定的承诺时:

return x将返回一个挂起的Promise,它将在随后的then上求值。

在Promise.prototype.then()文档中阅读有关此主题的更多信息。