Javascript 当某些函数花费很长时间时会发生什么?它们是异步的吗?
假设我有这样的代码:Javascript 当某些函数花费很长时间时会发生什么?它们是异步的吗?,javascript,node.js,Javascript,Node.js,假设我有这样的代码: app.get('/url', (req, res) => { if (req.some_magic == 1) { do_1(); } }); function do_1() { let requests = get_requests(); setTimeout(function() { request({ "uri": "url", "method": "POST", "json": rq }, (err, r
app.get('/url', (req, res) => {
if (req.some_magic == 1) {
do_1();
}
});
function do_1() {
let requests = get_requests();
setTimeout(function() { request({
"uri": "url",
"method": "POST",
"json": rq
}, (err, res, body) => {
do_1();
})}, 1000})
}
基本上,对于到达
/url
的一些请求,我必须向某个服务发送大量请求。我如何使此异步化,以便其他人向/url
发出的其他请求不必等待do_1
完成?或者节点已经像那样工作了?如果是的话,你有任何快速的解释或教程,我可以看看,以了解这是如何工作的?我来自莱姆普,所以它非常不同。非常感谢。几乎所有涉及从节点外部获取数据的功能(如网络请求或文件读取)都将使用异步功能。函数的文档应该告诉您(或者至少暗示函数返回承诺或接受回调函数作为参数)
您给出的示例显示了接受回调函数的请求
模块
主要的例外是明确定义为同步的函数(例如)
如果需要显式释放主事件循环,则可以使用。很少有人需要这样做,主要需要在JS中执行CPU密集型计算(这些计算没有外包给已经异步的库)。请参阅。这就是几乎所有http API的构建方式(使用承诺)。上述http调用将被异步调用。您不应使用
setTimeout
检查任何调用的结果。改用本机承诺对象。有关如何执行此操作,请参阅链接上的答案。或Node已按此方式工作?
Node已按此方式工作。在调用请求(…)
和(err,res,body)=>{do_1();}
之间,进程可以自由处理新的传入请求,并运行更多在后台处理I/O的异步函数。这是否回答了您的问题?