如果promise在此之前完成,会发生什么?
What happens if a promise completes before then is called?
假设我有一个这样的Promise
:
var promise = new Promise(function(resolve, reject) {
// Do some async thing
});
promise.then(function(response) {
// Then do some other stuff
});
如果async
Promise
在我调用.then()
之前完成会发生什么?通常,我只在Promise
函数中运行长时间的任务,但是如果它一次完成得非常快呢?
如预期的那样:在这种情况下,如果callback在promise已经解决后被调用,那么callback将立即被调用。
很容易测试:
var promise = new Promise(function(resolve, reject) {
resolve(123);
});
setTimeout(function() {
promise.then(function(response) {
alert(response);
});
}, 1000)
正如其他人已经指出的那样,您可以在承诺解决之前或之后使用.then
添加回调,甚至可以添加多个回调。
这些回调将按照它们被添加的顺序调用,但总是异步的,在事件循环的当前回合之后。因此,如果当您添加.then
时承诺已经解决,则您的处理程序将立即被调用,但在"异步意义"下。
Promises/A+规范说:
[…
onFulfilled
和onRejected
异步执行,在then
被调用的事件循环之后,使用一个新的堆栈。
promise具有状态,这意味着即使在promise被实现之后,您也可以使用.then
将回调函数附加到它上,并且它们将被调用,并且在它们被附加之后得到与promise被实现相同的结果。
实现是成功承诺的最终状态。这意味着您可以在将来将更多的处理程序附加到已完成的承诺上,使用承诺作为原始响应的缓存。
.then() on MDN
那么()
在此promise出现时立即调用所提供的函数之一满足或拒绝。返回一个新的promise,它的状态会发生变化取决于此承诺和提供的回调函数。
适当的回调总是在此方法返回后调用,即使这个承诺已经实现或被拒绝。你也可以在同一个promise上多次调用then方法,并且回调函数的调用顺序与注册顺序相同。
在承诺是resolved
之前,then
回调将永远不会被调用,这就是我认为您所说的完整。然而,如果promise在从函数返回之前被解析,那么在此之后链接的任何其他成功回调函数仍将被执行。例如,
function getMeAResolvedPromise() {
var prom = new Promise();
prom.resolve('some val');
return prom;
}
...
getMeAResolvedPromise.then(function(result) {
// this will still be executed
});
我很惊讶没有人提到MicroTasks队列。
即使解决承诺的.then
也不会立即执行:
const prom = Promise.resolve(11); // value's ready
prom.then(console.log);
console.log(22);
// prints 22 11
在已解决的promise上调用.then
调度一个微任务,该微任务将在调用堆栈变为空时执行。
- 什么是“;Promise在事件循环的同一个循环上点火“;意思是
- redux thunk和redux promise之间的区别是什么
- 在jQuery中返回promise()或deferred有什么区别
- 在 Promise 调用的错误函数回调后附加对象的用法是什么
- 当您不再持有对 ES6-Promise 的引用时会发生什么情况
- 返回值和 Promise.resolve 从 then() 有什么区别
- 在循环中使用 q promise 的最佳方法是什么?等待链完成,然后再迭代到下一个
- 使用带有promise而不是thunks的co-library有什么好处
- 什么'我的javascript promise代码有问题
- 在ES6 Promise中允许多次解析/拒绝的原因是什么
- 当在javascript中产生promise时会发生什么
- 当你想要所有结果而不管是否被拒绝时,用什么代替Promise.all()
- 什么'这是处理promise对象中错误结果的正确方法
- 使用 ES6 的 Promise.all() 时限制并发性的最佳方法是什么?
- 在Promise中,使用catch和它的第二个参数有什么区别?
- jQuery递归的Promise函数有什么问题?
- 在promise . all中实现长承诺链的最佳实践是什么?
- 如果promise在此之前完成,会发生什么?
- Q.all()和Promise.prototype.all()方法的区别是什么?
- 如果我用另一个Promise值拒绝一个Promise会发生什么?