Javascript 如何使用生成器使承诺同步执行
下面是我的博客文章: 也就是说,生成器可以用来同步承诺的执行 我知道这是一个糟糕的做法——我们使用的是一个类似GWT的框架(确切地说是Urweb),到目前为止,它只理解同步javascript函数返回值 以下代码取自该文章Javascript 如何使用生成器使承诺同步执行,javascript,ecmascript-6,es6-promise,Javascript,Ecmascript 6,Es6 Promise,下面是我的博客文章: 也就是说,生成器可以用来同步承诺的执行 我知道这是一个糟糕的做法——我们使用的是一个类似GWT的框架(确切地说是Urweb),到目前为止,它只理解同步javascript函数返回值 以下代码取自该文章 { 'use strict'; let asyncTask = () => new Promise(resolve => { let delay = 1000; setTimeout(function () {
{
'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.
我做错了吗?还是不可能使用同步发电机来实现承诺
我做错了吗
对。所有看似同步的代码都必须进入发电机功能内部:
makeMeLookSync(function* () {
let result = yield asyncTask();
console.log(result);
console.log(3);
});
还是不可能使用同步发电机来实现承诺
您可以从不使异步代码同步。生成器允许您编写看起来同步的代码,这意味着(在您链接的文章中提到)代码是自上而下执行的:
简单地说:异步JavaScript不会在自上而下读取时执行
但正如我上面提到的,这只在发电机内部起作用。yield
关键字允许您以同步方式编写代码。请注意,函数的名称是makeMeLookSync
,而不是makeMeSync
话虽如此,ES2017引入了一种基本上没有发电机和执行发电机的运行程序的方法:
{
"严格使用",;
让asyncTask=()=>
新承诺(解决=>{
设延时=1000;
setTimeout(函数(){
解决(延迟);
},延误);
});
控制台日志(1);
(异步函数(){
让结果=等待异步任务();
控制台日志(结果);
控制台日志(3);
}());
}
我做错了吗
对。所有看似同步的代码都必须进入发电机功能内部:
makeMeLookSync(function* () {
let result = yield asyncTask();
console.log(result);
console.log(3);
});
还是不可能使用同步发电机来实现承诺
您可以从不使异步代码同步。生成器允许您编写看起来同步的代码,这意味着(在您链接的文章中提到)代码是自上而下执行的:
简单地说:异步JavaScript不会在自上而下读取时执行
但正如我上面提到的,这只在发电机内部起作用。yield
关键字允许您以同步方式编写代码。请注意,函数的名称是makeMeLookSync
,而不是makeMeSync
话虽如此,ES2017引入了一种基本上没有发电机和执行发电机的运行程序的方法:
{
"严格使用",;
让asyncTask=()=>
新承诺(解决=>{
设延时=1000;
setTimeout(函数(){
解决(延迟);
},延误);
});
控制台日志(1);
(异步函数(){
让结果=等待异步任务();
控制台日志(结果);
控制台日志(3);
}());
}
这篇文章错了。它允许您以顺序(“同步”)的方式编写异步代码,而无需使用,然后
,它不会使承诺同步(这是不可能的)。顺便说一句,在现代Js中,使用async
/await
可以得到同样有利的语法。这篇文章是错误的。它允许您以顺序(“同步”)的方式编写异步代码,而无需使用,然后
,它不会使承诺同步(这是不可能的)。顺便说一句,在现代Js中使用async
/await
可以获得相同的优势语法。