如何使用我自己的函数产量?

时间:2016-03-07 07:22:01

标签: javascript node.js generator q

我是Generator概念的新手。我的理解是,如果函数返回Promise,那么它可以与yield一起使用。所以我有一个非常小的node.js脚本,如下所示:

Q.fcall(function*(){
  var url = "mongodb://" + config.host + ":" + config.port + "/" + config.db;
  var db = yield MongoClient.connect( url );
  var data = yield makeRequest();
  console.log( data );
  db.close();
});


function makeRequest(){
  var deferred = Q.defer();
  request({
      "method" : "GET",
      "url" : "....",
      "headers" : {
          "Accept" : "application/json",
          "user_key" : "...."
      }
  },function(err,data){
      if( err ){
          deferred.reject( err );
      }else{
          deferred.resolve( data );
      }
  });
  return deferred.promise;
}  

我知道这是有效的,因为我将它从回调地狱样式移植到生成器样式。但是,我没有在console.log中看到数据。

我需要做些什么来改变这项工作?

2 个答案:

答案 0 :(得分:1)

Q.fcall不适合使用生成器函数。在您的情况下Q.spawn

,您需要使用dedicated generator methods
Q.spawn(function*() {
  var url = "mongodb://" + config.host + ":" + config.port + "/" + config.db;
  var db = yield MongoClient.connect( url );
  try {
    var data = yield makeRequest();
    console.log( data );
  } finally {
    db.close();
  }
});

如果没有跑步者,发电机不会异步自动前进。

答案 1 :(得分:1)

考虑使用可以包装生成器并使其可调用的co。它会回报承诺。

const co = require('co');
const promisedGenerator = co.wrap(function* () {
  yield whatever1();
  yield whatever2();
  return databaseRequest(); 
});

promisedGenerator()
  .then(databaseResult => {
    console.log(databaseResult);
  });