- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于下面的代码
function inner () {
new Promise(function(resolve,reject){
resolve()
}).then(function(){
console.log('Inner Promise')
})
}
function outer() {
return new Promise(function(resolve, reject){
resolve()
inner()
})
}
outer().then(function(data) {
console.log('Outer Promise')
})
Inner Promise
Outer Promise
最佳答案
简而言之,您会看到所看到的行为,因为.then()
promise 上的inner()
方法首先在.then()
promise 上的outer()
方法之前运行,因此它的处理程序首先进入了队列(请参阅下面的逐步说明以了解这是为什么)。
What does Promise resolve do internally?
resolve()
将 promise 的内部状态更改为Fulfilled。那时,如果已将任何
.then()
处理程序附加到Promise,则将它们添加到队列中,以便在堆栈展开并且Javascript的当前运行路径完成时将其执行,并将控制权返回给系统。请注意,在这种情况下(当您阅读下面的逐步分析时,您将看到),如果还没有注册任何
.then()
处理程序,则什么都不能添加到队列中。
I thought the outer resolve would be the first to enter the JS Message Queue followed by the inner resolve. However the JS Event Loop fires the Inner resolve first then followed by Outer resolve.
resolve()
是同步的。它将当前 promise 的状态立即更改为已实现状态。如果在兑现 promise 时已经注册了任何
.then()
处理程序,那么它们就是添加到队列中的内容。但是,在您的两个 promise 中,当您的每个 promise 都得到解决时,尚没有
.then()
处理程序附加。因此,这些
.then()
处理程序不会在应许解决的时候排队。相反,当
.then()
方法实际运行并注册它们时,它们将在以后排队。
outer()
。这将创建一个Promise对象,并在您传递该对象时同步调用Promise执行程序回调。 resolve()
,它将使当前附加的.then()
处理程序的调用排队。请注意,目前您调用resolve()
,尚无.then()
处理程序,因为在此代码outer().then()
中,您仍在运行outer()
和.then()
尚未运行,因此实际上还没有任何要排队的内容(这可能是您观察到的订购的关键-请继续阅读以获取更多详细信息)。 inner()
。这将创建一个新的Promise,然后(仍在同步运行)调用您传递给它的Promise执行程序回调,该回调调用resolve()
。同样,还没有附加任何.then()
处理程序,因此尚无其他安排将来执行。 inner()
内的Promise执行程序返回,并且对.then()
内的promise调用inner()
方法。该 promise 已经解决,因此,当调用此.then()
处理程序时,该 promise 知道将其安排在将来运行。由于当堆栈只解开平台代码时,所有.then()
处理程序都被异步调用,因此它不会立即运行,而是计划将其放在队列中以在将来运行。这完全取决于实现方式,该队列的工作方式(宏任务或微任务等),但是我们知道Promise规范可以保证它在当前正在执行的同步JS代码片段完成运行并返回控制后运行回到系统。 inner()
返回(代码仍在同步运行)。 outer()
返回,并且.then()
中的outer().then()
方法运行。就像在前面的示例中一样,当调用此.then()
方法时,主机 promise 已经解析。因此,promise引擎会通过将.then()
处理程序回调添加到队列中来安排其运行。 .then()
处理程序按照它们的运行顺序进行排队(这是逻辑实现),那么您会看到.then()
上的inner()
处理程序首先运行,然后.then()
上的outer()
处理程序将运行,因为inner().then() ran first before
external()。then()`。那就是你观察到的。 outer()
之前先解决inner()
,但在解决outer()
时,没有附加.then()
处理程序,因此解决该问题时无需安排任何将来执行的计划。这可能是为什么即使先解决它的.then()
处理程序也不先运行的原因。一旦inner()
和outer()
都解决了,它是内部的.then()
方法首先运行,因此在安排.then()
处理程序运行时首先遇到了麻烦,这就是您所观察到的。 .then()
处理程序将首先触发,则可以将其链接到
outer()
promise ,如下所示:
function inner () {
return new Promise(function(resolve,reject){
resolve();
}).then(function(){
console.log('Inner Promise')
})
}
function outer() {
// Add return here to chain the inner promise
// make to make sure that outer() does not resolve until
// inner() is completely done
return inner();
}
outer().then(function(data) {
console.log('Outer Promise')
})
outer().then()
处理程序,则必须选择其他结构,因为该结构不会以任何方式强制执行这种类型的订单,并且除非您有意识地延迟了运行的时间,否则无法使该方向困惑
inner()
(使用
setTimeout()
或类似的东西)或重组代码。例如,如果您确实想进行重组以强制
inner()
最终运行,则可以在
outer().then()
处理程序中将其启动,如下所示:
function inner () {
return new Promise(function(resolve,reject){
resolve()
}).then(function(){
console.log('Inner Promise')
})
}
function outer() {
return new Promise(function(resolve, reject){
resolve()
})
}
outer().then(function(data) {
console.log('Outer Promise')
return inner();
})
关于javascript - 解决 promise 中的 promise 顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42031051/
如何从 promise 中退出 promise ? perl6 文档没有提供简单的方法。例如: my $x = start { loop { # loop forever until "qui
我的用户 Controller 中有一个索引操作,其中我试图连续做两件事,并且在它们都有机会完成之前不执行所需的 res.json() 方法。 我有一个加入用户的友谊加入模型。一列是 friender
请帮我解释一下为什么日志结果有两种不同: 方式 1:每 1 秒顺序记录一次 方式 2:1 秒后记录所有元素。 // Way 1 let sequence = Promise.resolve(); [1
我的问题很简单。 Promise.all() 方法可以返回 Promise 吗?让我解释一下: function simpleFunction() { let queue = [];
我正在使用 Promise 从存储中读取文件并转换为 base64 字符串。我有图像数组,使用 RNFS 读取图像 const promise_Images = _Images.map(async (
如果使用非空数组调用 Promise.all 或 Promise.race,它们将返回一个待处理的 Promise: console.log(Promise.all([1])); // prints
Promise.all 是否可以在没有包装 promise 的情况下返回链的最后一个值? 如果不使用 await,它在我的上下文中不起作用 没有包装的例子: function sum1(x){ r
我一直在玩 promise,通常能想出如何处理好它们,但在这种情况下,我不知道如何删除一个 promise-wrapping level。 代码如下: let promise2 = promise1.
考虑以下嵌套的Promises结构: const getData = async() => { const refs = [{ name: "John33", age: 3
我已经阅读了 Promise/A+ 规范,但据我了解,还有诸如 Promise/A 和 Promise 之类的东西。它们之间有什么区别? Promise 和 Promise/A 规范也是如此吗?如果是
当我运行以下代码时: my $timer = Promise.in(2); my $after = $timer.then({ say "2 seconds are over!"; 'result'
以下简单的 promise 是发誓的,我不允许打破它。 my $my_promise = start { loop {} # or sleep x; 'promise re
我正在尝试扩展Promise: class PersistedPromise extends Promise { } 然后在派生类上调用静态resolve以直接创建一个已解决的Promise: Per
我有两个返回 promise 的函数,我独立使用它们作为: getLocal().then(...) 和 getWeb().then(...) 但是现在我遇到了一个奇怪的问题: 1) 我需要第三个
我不知道 promise.all 解决方案中的 promise.all 是否是一个好的实践。我不确定。 我需要从一组用户获取信息,然后通过此信息响应,我需要发送消息通知。 let userList =
我一直在尝试使用 queueMicrotask() 函数,但我没有弄清楚当回调是微任务时回调的优先级如何。查看以下代码: function tasksAndMicroTasks() { const
我一直在尝试使用 queueMicrotask() 函数,但我没有弄清楚当回调是微任务时回调的优先级如何。查看以下代码: function tasksAndMicroTasks() { const
今年早些时候,我在 Pharo Smalltalk 参与了一个 promise 项目。这个想法是为了实现以下行为: ([ 30 seconds wait. 4 ]promiseValue )then:
大家好,提前感谢您的帮助。 下面是我正在尝试做的事情 function1(){ throw some error(); } function2() { // dosomething suc
我有以下未解析的代码。f2 解决了,所以我不会添加该代码,它是 f1 我有问题。 我调用函数,它到达最里面如果,它调用函数“find”,它执行函数 findId,完美返回 Id,然后执行 editId
我是一名优秀的程序员,十分优秀!