如何使一个函数等待,直到使用node.js调用回调

我有一个简化的函数,看起来像这样:

function(query) {
  myApi.exec('SomeCommand', function(response) {
    return response;
  });
}

基本上我希望它调用myApi.exec ,并返回回调lambda中给出的响应。 但是,上面的代码不起作用,并立即返回。

只是为了一个非常冒险的尝试,我尝试了下面哪个方法不起作用,但至少你明白了我想要达到的目标:

function(query) {
  var r;
  myApi.exec('SomeCommand', function(response) {
    r = response;
  });
  while (!r) {}
  return r;
}

基本上,这是一个很好的“node.js /事件驱动”方式吗? 我希望我的函数等待回调被调用,然后返回传递给它的值。


这样做的“好node.js /事件驱动”方式是不要等待

与使用事件驱动系统(如节点)一起工作时几乎一样,您的函数应接受一个回调参数,该参数在计算完成后将被调用。 调用者不应该等待正常意义下的“返回”值,而是发送处理结果值的例程:

function(query, callback) {
  myApi.exec('SomeCommand', function(response) {
    // other stuff here...
    // bla bla..
    callback(response); // this will "return" your value to the original caller
  });
}

所以你不要这样使用它:

var returnValue = myFunction(query);

但是像这样:

myFunction(query, function(returnValue) {
  // use the return value here instead of like a regular (non-evented) return value
});

检查这个:https://github.com/luciotato/waitfor-ES6

您的代码与wait.for :(需要生成器, - 和谐标志)

function* (query) {
  var r = yield wait.for( myApi.exec, 'SomeCommand');
  return r;
}

如果你不想使用回拨,那么你可以使用“Q”模块。

例如:

function getdb() {
    var deferred = Q.defer();
    MongoClient.connect(databaseUrl, function(err, db) {
        if (err) {
            console.log("Problem connecting database");
            deferred.reject(new Error(err));
        } else {
            var collection = db.collection("url");
            deferred.resolve(collection);
        }
    });
    return deferred.promise;
}


getdb().then(function(collection) {
   // This function will be called afte getdb() will be executed. 

}).fail(function(err){
    // If Error accrued. 

});

有关更多信息,请参阅:https://github.com/kriskowal/q

链接地址: http://www.djcxy.com/p/55683.html

上一篇: How to make a function wait until a callback has been called using node.js

下一篇: Getting authorized access error from Spotify with spotify