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 () {

下面是我的博客文章:

也就是说,生成器可以用来同步承诺的执行

我知道这是一个糟糕的做法——我们使用的是一个类似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.

我做错了吗?还是不可能使用同步发电机来实现承诺

我做错了吗

对。所有看似同步的代码都必须进入发电机功能内部:

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
可以获得相同的优势语法。