【发布时间】:2017-10-30 02:46:41
【问题描述】:
我在这里关注博客文章: 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
但是如果承诺是同步的,那么输出应该是
1
1000
3
我做错了吗?还是不可能使用生成器使承诺同步?
【问题讨论】:
-
文章有误。它允许您以顺序(“同步”)方式编写异步代码而不使用
then,它不会使承诺同步(这是不可能的)。顺便说一句,在现代 Js 中使用async/await可以获得相同的优势语法。
标签: javascript ecmascript-6 es6-promise