我是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中看不到数据。

要进行这项工作,我需要更改什么?

最佳答案

Q.fcall不适合与生成器函数一起使用。为此,您需要使用dedicated generator methods,例如Q.spawn

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();
  }
});


没有跑步者,发电机将不会自动异步推进。

10-07 19:24
查看更多