相关疑难解决方法(0)

为什么这个异步函数会在它之前定义的等价 Promise.then 链之前执行?

我有以下代码:

var incr = num => new Promise(resolve => {
  resolve(num + 1);
});

var x = incr(3)
  .then(resp => incr(resp))
  .then(resp => console.log(resp));

async function incrTwice(num) {
  const first = await incr(num);
  const twice = await incr(first);
  console.log(twice);
}

incrTwice(6);
Run Code Online (Sandbox Code Playgroud)

我相信(可能是错误的)显示了实现相同功能的两种等效方法:首先通过链接承诺,其次使用 async/await 的语法糖。

我希望promise 链接解决方案首先是console.log,然后是异步函数,但是异步函数console.log 的第一个然后是promise 链接解决方案打印。

我的逻辑如下:

  1. xs 初始解析将在处理声明时首先出现在微任务队列中
  2. x和的声明之间堆栈是空的,incrTwice这将导致微任务队列被刷新(导致承诺链的完成)
    • x 先打印
  3. incrTwice 被定义为
  4. incrTwiceawaits处的微任务队列上执行排队,最终打印到控制台
    • incrTwice 打印第二个

显然我在某处有误解,有人能够指出我错在哪里吗?

javascript promise async-await es6-promise

17
推荐指数
1
解决办法
534
查看次数

ES6承诺返回值的执行顺序

为了理解ES6 promise的执行顺序,我注意到链接处理程序的执行顺序受前一个处理程序是返回值还是promise的影响.

let a = Promise.resolve();
a.then(v => Promise.resolve("A")).then(v => console.log(v));
a.then(v => "B").then(v => console.log(v));
Run Code Online (Sandbox Code Playgroud)

直接在Chrome(v 61)控制台中运行时的输出:

B
A.

但是,当点击Run code snippet按钮时,我会收到订单A B.

是否在ES6中为上述示例定义了执行顺序,还是由实现决定?

如果定义了,那么正确的输出应该是什么?

javascript ecmascript-6 es6-promise

9
推荐指数
1
解决办法
471
查看次数

承诺`then`,函数不返回任何内容,而函数返回另一个承诺

我不明白为什么我们执行这段代码会有如此奇怪的结果。

为什么没有 12121212 的图像?在每个 1 之后,我们有三个 2。

Promise.resolve()
.then(() => { console.log(1); return Promise.resolve(); })
.then(() => { console.log(1); return Promise.resolve(); })
.then(() => { console.log(1); return Promise.resolve(); })
.then(() => { console.log(1); return Promise.resolve(); })
.then(() => { console.log(1); return Promise.resolve(); })
.then(() => { console.log(1); return Promise.resolve(); })
.then(() => { console.log(1); return Promise.resolve(); })
.then(() => { console.log(1); return Promise.resolve(); });

Promise.resolve()
.then(() => { console.log(2); })
.then(() => { console.log(2); })
.then(() => { console.log(2); }) …
Run Code Online (Sandbox Code Playgroud)

javascript promise

4
推荐指数
1
解决办法
73
查看次数