Node.js 正在等待异步HTTP请求完成

Node.js 正在等待异步HTTP请求完成,node.js,Node.js,这个问题已经在这里以各种方式被问过了,我非常理解这个问题。一般的解决方案是调用回调来处理HTTP结果,但我特别希望避免这种情况 我想我可以使用一个“我们完成了吗”的标志来保持工作状态,但这并没有像预期的那样工作 // // Test the IP the comment came-from. // exports.testJSON = function ( obj ) { var ip = obj['ip'] || ""; var result = null;

这个问题已经在这里以各种方式被问过了,我非常理解这个问题。一般的解决方案是调用回调来处理HTTP结果,但我特别希望避免这种情况

我想我可以使用一个“我们完成了吗”的标志来保持工作状态,但这并没有像预期的那样工作

//
//  Test the IP the comment came-from.
//
exports.testJSON = function ( obj )
{
    var ip     = obj['ip'] || "";
    var result = null;
    var done   = false;

    //
    //  The URL request we're going to make
    //
    var options = {
        host: 'www.stopforumspam.com',
        port: 80,
        path: '/api?ip=' + ip
    };

    //
    // A GET request
    //
    var re = http.request(options, function(res) {
        var str = '';

        res.on('data', function(chunk) {
            console.log( "Got data " + chunk );
            str += chunk;
        });
        res.on('end', function() {
            console.log( "Got END" );
            result = "..... ";
            done = true;
        });
      }).on('error', function(e) {
         done = true;
         console.log("Got error: ", e);
     });

   re.end();

   while( ! done ) {
   }

   return( result );
};
遗憾的是,这不起作用-繁忙的外观只是无限旋转,我看不到任何控制台日志表明我正在接收数据

将“process.nextTick()”添加到“while(!done){}”循环中也没有什么区别


当然,我不需要修改我的整个插件系统以适应不同的方法,而且回调更新“完成”标志会以某种方式起作用?

如果你的整个插件系统都在使用JavaScript,修改它可能不是一个坏主意。如果您不想使用回调处理异步代码,那么可以将Promissions作为管理异步代码的另一种解决方案。图书馆可能是一个很好的开始

另一种选择是使用。我以前从未使用过它,但示例很简单。以普通回调模式为例:

console.log('等待2秒…);
setTimeout(函数(){
console.log('Finished!');
}, 2000);
使用节点光纤的类似示例:

var-Fiber=require('fibers');
函数等待(毫秒){
var fiber=光纤电流;
setTimeout(函数(){
fiber.run();
},ms);
纤维产量();
}
光纤(功能(){
log('等待3秒…');
等待(1000);
log('等待2秒…');
等待(1000);
log('等待1秒…');
等待(1000);
console.log('done!');
}).run();

要使节点光纤正常工作,需要做一些包装,但现在可以避免处理回调,并以同步方式使用异步代码

您的整个插件系统都是用JavaScript编写的吗?很抱歉,如果您试图使用同步循环来检查异步结果,那么您对问题的理解就不太清楚了。在javascript(afaik)中,您试图从异步调用中返回结果的操作是不可能的。任何同步代码都会阻塞整个线程(阻止请求发出)或在请求发出之前返回。我想可以通过黑客攻击一些线程使其正常工作,但我不建议这样做。是的,我正在将系统从perl+XML::RPC移植到HTTP-JSON消费node.js服务器。安德烈亚斯-是的,你是对的。我的意思是我理解了为什么事情是这样的,因为我使用的是一个幼稚的插件架构,所以我不能很容易地适应使用回调返回结果。具体的问题是在回调完成之前到达函数结尾-这是显而易见的,但我希望解决这个问题,我发现我不能:(值得一提的是,为什么他的解决方案不起作用——他的node.js代码在单个线程中运行,而while循环永远控制着线程,因此回调永远没有机会被调用。事实上,看起来我必须查看一些mpm promise/queue模块,看看是否能找到合适的方法。我过去使用过该库-可能也值得一看。