当一个promise的resolve回调返回另一个promise时,它是如何工作的
When the resolve callback from one promise returns another promise, how does it work?
在工作中,我们反复使用代码结构。我们都同意它确实有效,但我们不知道它为什么有效。这让我很不舒服。
我制作了一个小提琴,展示了代码结构的简化版本。它在运行。有人能告诉我发生了什么事吗?
http://jsfiddle.net/rhedin/zLbusowf/
谢谢。
我想网址不起作用。我已经更改了它,但这里还有代码:
function promiseAfter(seconds) {
var promise = new Promise( (resolve) => {
setTimeout(function () {resolve()}, 1000 * seconds)
})
return promise;
}
function dog() {
console.log('Dog has started')
cat().then(function () {
console.log('In Dog. Cat has finished')
})
console.log('Dog has finished')
}
function cat() {
console.log('Cat has started')
return promiseAfter(1).then( () => {
console.log('In Cat. Outer promise satisfied')
return promiseAfter(1).then( () => {
console.log('In Cat. Inner promise satisfied')
})
})
console.log('Anything after the return stmt in Cat is never executed')
}
dog();
代码中发生的情况是:
dog()调用cat(),cat调用promise promiseAfter,完成通话。
它是如何工作的?
"cat"函数返回第一次调用"promiseAfter(1)"生成的promise,该promise与内部"promiseAfter(1))"返回的内部promise链接。所以cat只会被解析,当第一个"promiseAfter(1)"被解析时,调用"cat().then"的"then",而第一个"promiseAfter"只会在其内部"promiseAfter(1))被解析后被解析。
承诺和承诺链:
我看到你对嵌套的承诺有问题,所以我会尝试更详细地解释。
只是为了强化这个概念,promise是一个对象,"它表示一个尚未完成的操作,但有望在未来完成"(来自https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise),这个对象有一个名为"then"的方法,然后只有当你的promise对象被解析时才会触发,所以
var promise = new Promise( (resolve) => {
setTimeout(function () {resolve()}, 1000 * seconds)
})
// below the anonymous function passed to ".then" will only be called after 1 second (after the timeout is triggered and resolve() is called)
promise.then(function() { ... })
现在,返回您的代码:
function cat() {
return promiseAfter(1).then( () => { // will be resolved and call this anonymous function after 1 second
console.log('In Cat. Outer promise satisfied')
return promiseAfter(1).then( () => { // will be resolved and call this anonymous function after the outer promise is resolved (1 second) and after 1 second has passed, so this will be called after 2 seconds
console.log('In Cat. Inner promise satisfied')
})
})
};
你已经知道promiseAfter(1)会给你一个承诺,这个承诺会在1秒后得到解决。问题是,外部promiseAfter(1)调用其"then"方法传递一个匿名函数,该函数返回另一个promiseAfter,这对这里发生的事情至关重要,在传递给外部promiseAfter(1)的.then方法的匿名函数中返回一个新的promise对象,这一事实使它采用内部promiseAfter的最终状态。因此,最终"cat()"将为您提供一个promise对象,该对象只有在最内部的"promiseAfter(1)"被解析时才会被解析,而内部对象只有在外部对象被解析后(1秒)和1秒后(1用于解析外部对象,加上1用于完成内部对象的setTimeout)才会被解析。enter code here
- Javascript:selenium Web驱动程序isDisplayed()不工作
- jQuery UI自动完成突然停止工作
- AngularJS UI路由器不能像ng路由器那样工作
- 使用promise和mongoose对文档进行排序
- Defer 和 Promise in angularjs 无法正常工作
- WinJS.Promise没有像我预期的那样工作
- 延迟语句(如 promise() 和 done())如何工作
- Promise.all 不应该作为传递给 .then 的函数工作
- $when.apply在promise数组中的某个promise被延迟时不工作
- promise在JavaScript中是如何工作的
- Backbone fetch,promise and if else.它们是如何工作的
- 当一个promise的resolve回调返回另一个promise时,它是如何工作的
- 在JavaScript中的类中,push和concat的工作方式有何不同
- 在javascript中promise是如何工作的?
- 当action使用promise时,indexOf拒绝在值突变中工作
- 带有promise.prototype.的Axios最终无法工作
- promise如何与嵌套函数调用一起工作
- ES2017 Async/await函数-它们只与promise一起工作吗
- 使用promise链接同步与异步功能时的工作流
- 如何使这个异步foreach循环与promise一起工作