gpt4 book ai didi

node.js - 等待异步 HTTP 请求完成

转载 作者:太空宇宙 更新时间:2023-11-03 23:43:24 25 4
gpt4 key购买 nike

这个问题已经在这里以各种方式提出,我非常理解这个问题。一般的解决方案是调用回调来处理 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,那么重新设计它可能不是一个坏主意。如果您不想使用回调处理异步代码,您可以将 Promise 作为管理异步代码的另一种解决方案。图书馆"q"也许是一个很好的起点。

另一种方法是使用 node-fibers 。我以前从未使用过它,但示例很简单。以正常的回调模式为例:

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

使用 Node 纤维的类似示例:

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

需要进行一些包装才能使 Node 纤维发挥作用,但现在您可以避免处理回调并以同步方式使用异步代码。

关于node.js - 等待异步 HTTP 请求完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18721991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com