gpt4 book ai didi

javascript - 如何使用生成器使 Promise 同步执行

转载 作者:行者123 更新时间:2023-11-28 17:44:47 25 4
gpt4 key购买 nike

我正在关注这里的博客文章: http://www.tivix.com/blog/making-promises-in-a-synchronous-manner

它表示生成器可用于同步 Promise 执行。

我知道这是一个不好的做法 - 我们正在使用类似 GWT 的框架(准确地说是 Urweb),它目前只理解同步 javascript 函数的返回值。

以下代码摘自该文章

{
'use strict';

let asyncTask = () =>
new Promise(resolve => {
let delay = 1000;

setTimeout(function () {
resolve(delay);
}, delay);
});

let makeMeLookSync = fn => {
let iterator = fn();
let loop = result => {
!result.done && result.value.then(res =>
loop(iterator.next(res)));
};

loop(iterator.next());
};

console.log(1);

makeMeLookSync(function* () {
let result = yield asyncTask();

console.log(result);
});

console.log(3);
}

给出以下输出:
1
3
1000

但是如果 promise 是同步的,那么输出应该是


1
1000
3

我做错了吗?或者是否无法使用生成器使 Promise 同步?

最佳答案

Am I doing it wrong ?

是的。所有应该看起来同步的代码都必须进入生成器函数:

makeMeLookSync(function* () {
let result = yield asyncTask();

console.log(result);
console.log(3);
});

Or is it not possible to make the promise synchronous using generators ?

永远无法使异步代码同步。生成器允许您编写看起来同步的代码,这意味着(并且在您链接到的文章中提到)代码是从上到下执行的:

To put it as simply as possible: async JavaScript does not execute as it reads - top to bottom.

但这仅适用于我上面提到的生成器内部。 yield关键字允许您以同步方式编写代码。请注意,该函数的名称是 makeMe<strong>Look</strong>Sync ,不是makeMeSync .

<小时/>

话虽如此,ES2017推出了 async functions基本上在没有生成器和运行器来执行生成器的情况下做同样的事情:

{
'use strict';

let asyncTask = () =>
new Promise(resolve => {
let delay = 1000;

setTimeout(function() {
resolve(delay);
}, delay);
});


console.log(1);

(async function() {
let result = await asyncTask();
console.log(result);
console.log(3);
}());
}

关于javascript - 如何使用生成器使 Promise 同步执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47007472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com