- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想了解这段代码是如何工作的。我已经使用 promise 工作了一段时间,但我想知道这里发生了什么。
for(let i=0 ; i< 3 ;i++){
new Promise((resolve,reject)=>{
console.log("i = "+i)
resolve(i)
})
.then(r=>{
console.log("promise 1 of "+r)
return new Promise((res,rej)=>res(r))
})
.then(r=>{
console.log("promise 2 of "+r)
return new Promise((res,rej)=>res(r))
})
}
console.log("finish")
输出是
i = 0
i = 1
i = 2
finish
promise 1 of 0
promise 1 of 1
promise 1 of 2
promise 2 of 0
promise 2 of 1
promise 2 of 2
为什么在其他 promise 执行之前显示完成。
提前致谢
最佳答案
Why is finish being displayed before the other promises left to execute.
因为该代码中没有任何内容告诉 console.log
在运行之前等待 promise 完成。如果你想这样做,将它们收集在一个数组中,然后使用:
Promise.all(theArray)
.then(() => {
console.log("finish");
});
...告诉它等待他们。
请记住,then
处理程序总是 被异步调用。因此,您的代码创建了三个 promise 链,然后在末尾输出 console.log
,然后将异步回调获取到 then
处理程序 - 所以这些结果会在之后显示。
旁注:您问题中的代码可以更简单地写成这样:
for(let i = 0; i < 3; i++) {
console.log("i = " + i);
Promise.resolve(i)
.then(r => {
console.log("promise 1 of " + r);
return r;
})
.then(r => {
console.log("promise 2 of " + r);
return r;
});
}
console.log("finish");
为什么:
console.log("i = "+ i); 之间没有区别。
行作为执行程序函数的第一行,或者就在您创建 promise 的行之上。Promise.resolve
使用您提供的值创建已解决的 promise 。then
always 创建一个新的 promise 。当您从 then
处理程序返回一个非 promise 值时,该值是 promise then
返回的解析值。如果您返回一个 promise ,那么 then
创建的 promise 将“从属于”您返回的 promise (等待它解决或拒绝,然后执行相同的操作)。在评论中你问了一个非常聪明的问题:
If "then" is called asynchonously then the output order of these promises may not be predicted right?
要点:then
不是异步调用的,它的处理程序(您传递给它的函数)是异步调用的。
在一般情况下,是的,没错,您无法预测独立 promise (没有链接在一起的 promise )的顺序。您可以预测 链接在一起的 promise (链中较早的 promise 在较晚的 promise 之前处理)。在您的代码中,您有三个独立的链(一个用于 i = 0,一个用于 i = 1,另一个用于 i = 2);每个链都有两个处理程序(“1 of”和“2 of”)。所以你知道链“i = 0”中的“1 of”将在同一链中的“2 of”之前发生,但在一般情况下你不知道 i = 0
是否会成为第一个或 i = 2
一个或其他。
但是,在这种特定情况下,可以预测顺序(至少在浏览器中,在 Node.js 上也是如此),因为每个链中的初始 promise 开始out pre-resolved,这意味着当您调用 then
时,对其 then
处理程序的调用会立即放入微任务队列¹。微任务队列在每个任务(又名“宏任务”)结束时运行。因此,运行主代码的任务会立即按顺序将回调排队到每个链的“1 of”处理程序。当该处理程序运行时,它会将微任务排队以调用“2 of”处理程序。因此,由于 promises 开始得到解决,我们知道我们会得到您得到的输出。但在一般情况下,你是对的,你无法预测 链。
¹ 这是它的网络术语; JS 规范将其称为 PromiseJobs 队列。更多关于“微任务”和任务/宏任务的信息,请参阅 this answer .
关于javascript - 在循环中使用 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52664536/
如何从 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
我是一名优秀的程序员,十分优秀!