首页 > 解决方案 > 如何将 co.wrap 与生成器一起使用

问题描述

const co = require('co');

const func1 = function(){
  setTimeout(()=>{
    console.log('func1');
  },2000);
}

const func2 = function(){
  setTimeout(()=>{
    console.log('func2');
  },2000);
}

const func3 = function(){
    console.log('func3');
}

const gen = co.wrap(function*(){
  yield func1;
  yield func2;
  return yield func3;
});


gen()
.then(function(){console.log('end')});

预期结果是 func1 func2 func3 end

但它没有显示我的意图。

它显示 func1

如何修复代码以输出预期结果

标签: javascriptgeneratorco

解决方案


两个问题:

  1. 您的函数无法返回控制权。如果您想使用 thunk(文档建议不要这样做),您需要实际获取并调用回调:

    const func1 = function(cb){
      setTimeout(()=>{
        console.log('func1');
    
        return cb();
      },2000);
    };
    

    但是,最好使用 Promise:

    const func2 = function(){
      return new Promise((resolve) => {
        setTimeout(()=>{
          console.log('func2');
    
          return resolve();
        },2000);
      });
    };
    
  2. 如果使用 Promise,则需要在 yield 时调用该函数:

    yield func2();
    

    yield如果它是一个 thunk,你可以只调用一个函数而不调用它。


推荐阅读