等待asynchronousHTTP请求完成

这个问题在这里已经有了各种各样的问题,我也很了解这个问题。 一般的解决scheme是调用callback来处理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 ); }; 

可悲的是,这不起作用 – 繁忙的外观只是无限期的旋转,我看到没有控制台日志logging,表明我正在接收数据。

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

当然,我不需要重新整理我的整个插件系统,以应付不同的方法,更新“完成”标志的callback将起作用,不知何故?

如果你的整个插件系统正在使用JavaScript,重做它可能不是一个坏主意。 如果您不想使用callback来处理asynchronous代码,则可以将Promise作为pipe理asynchronous代码的另一种解决scheme。 图书馆“q”可能是一个开始的好地方。

另一种方法是使用节点光纤 。 我以前从来没有用过,但例子很简单。 以一个正常的callback模式为例:

 console.log('waiting 2 seconds...'); setTimeout(function() { console.log('Finished!'); }, 2000); 

一个使用节点光纤的例子:

 var Fiber = require('fibers'); function wait(ms) { var fiber = Fiber.current; setTimeout(function() { fiber.run(); }, ms); Fiber.yield(); } Fiber(function() { console.log('waiting 3 seconds...'); wait(1000); console.log('waiting 2 seconds...'); wait(1000); console.log('waiting 1 seconds...'); wait(1000); console.log('done!'); }).run(); 

为了使节点光纤能够正常工作,需要做一点小小的改动,但是现在你可以避免处理callback并以同步的方式使用asynchronous代码。