Javascript ES6:如何拆分异步生成器函数而不丢失屈服能力

Javascript ES6:如何拆分异步生成器函数而不丢失屈服能力,javascript,typescript,asynchronous,ecmascript-6,generator,Javascript,Typescript,Asynchronous,Ecmascript 6,Generator,我有一个异步生成器函数(批处理作业),它随着时间的推移变得相当大。 我想将其拆分为多个功能: async *execute(): AsyncGenerator<ISyncState> { await doThis(); await doThis2(); await doThis3(); yield "this"; await doThis4(); await doThis5(); await doThat(); yield "tha

我有一个异步生成器函数(批处理作业),它随着时间的推移变得相当大。 我想将其拆分为多个功能:

async *execute(): AsyncGenerator<ISyncState> {

   await doThis();
   await doThis2();
   await doThis3();
   yield "this";

   await doThis4();
   await doThis5();
   await doThat();
   yield "that";

   // .. many more functions

}

async doThis() {...}
async doThat() {...}
async doThis2() {...}
我想把它变成:

async *execute(): AsyncGenerator<ISyncState> {

   await step1();

   await step2();

   await step3();
}

async step1() {
   await doThis();
   yield "this1"; <-- doesn't work
   await doThis2();
   yield "this2"; <-- doesn't work
   await doThis3();
   yield "this3"; <-- doesn't work
}
async*execute():AsyncGenerator{
等待步骤1();
等待步骤2();
等待步骤3();
}
异步步骤1(){
等着做这件事吧;

产生“this1”就像在普通生成器中一样,您可以在异步生成器中使用
yield*
产生子生成器产生的结果,即使子生成器也是异步的:

constdothis=()=>Promise.resolve();
异步函数*execute(){
屈服*step1();
//等待步骤2();
//等待步骤3();
}
异步函数*step1(){
等着做这件事吧;
//等待doThis2();
//等待doThis3();
产生“这个”;
}
(异步()=>{
用于等待(execute()的常量项){
控制台日志(项目);
}
})();
您使您的“步骤”本身成为异步生成器。如下所示:

异步函数*step1(){
屈服等待步骤1a();
屈服等待步骤1b();
屈服等待步骤1c();
}
然后你可以这样说,使用:

异步函数*execute(){
用于等待(步骤1()的项目){
收益项目;
}
用于等待(步骤2()的项目){
收益项目;
}
用于等待(步骤3()的项目){
收益项目;
}
. . .
}
async *execute(): AsyncGenerator<ISyncState> {

   await step1();

   await step2();

   await step3();
}

async step1() {
   await doThis();
   yield "this1"; <-- doesn't work
   await doThis2();
   yield "this2"; <-- doesn't work
   await doThis3();
   yield "this3"; <-- doesn't work
}