我是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();
}
});
没有跑步者,发电机将不会自动异步推进。