如何在Javascript中编写非阻塞回调
How to write a non-blocking callback in Javascript?
本文关键字:回调 Javascript 更新时间:2023-09-26
下面是我正在尝试的一些代码:
startTask();
function startTask(){
console.log('startTask enter');
startLongTask(1, function(){
console.log('long task complete');
});
console.log('startTask exit');
}
function startLongTask(i, callback) {
while (i++ < 10000){
console.log(i);
}
callback();
}
这里是输出(省略了数字的大序列):
startTask enter
2
3
4
5
6
7
8
9
10
long task complete
startTask exit
很明显,如果我有一个长期运行的操作,它是同步的。这就像在startTask中内联startLongTask。如何将此回调修复为非阻塞。我期望的输出是:
startTask enter
startTask exit
2
3
4
5
6
7
8
9
10
long task complete
Javascript纯代码无法在纯JS中创建新的异步操作,因为node.JS中的V8解释器没有为您提供完整的线程。
node.js中的fs
模块等库从本机操作(js/V8世界之外)获得异步行为,并通过异步接口与js引擎接口。
也就是说,有一些方法可以通过使用一些非js代码在node.js中的后台运行操作。你可以启动另一个进程,你可以使用各种支持其他执行线程的附加模块,等等。所有这些都将超出纯node.js Javascript,以便提供异步接口。
如果你的任务可以分成小段,你也可以通过在连续的定时器上做少量的工作来模拟异步操作(这也是浏览器中常见的解决方法)。
您可以使用延迟0毫秒的超时函数。超时中的任何函数都将被推送到执行线程的末尾。例如
startTask();
function startTask(){
console.log('startTask enter');
setTimeout(function(){
startLongTask(1, function(){
console.log('long task complete');
})
}, 0);
console.log('startTask exit');
}
function startLongTask(i, callback) {
while (i++ < 100){
console.log(i);
}
callback();
}
相关文章:
- 如何将一个JavaScript函数回调为多个函数
- JavaScript回调函数
- 用于回调的javascript参数
- Soundcloud Javascript SDK 3.0-回调无法读取属性'connectCallback
- Javascript点击事件回调不起作用
- 如何让程序员在javascript中实现正确的回调
- 从多个回调 javaScript 返回最终对象
- 如何使用传递参数回调 JavaScript 对象属性
- 可能从其他域弹出时回调 JavaScript
- 一个函数,它接受回调并创建只能调用一次的新版本的回调.Javascript
- 构造Javascript回调:Javascript/JQuery
- 对象成员函数的回调?(Javascript)
- 回调javascript动画
- 如何将自定义回调javascript参数添加到bing API回调中
- Facebook喜欢按钮回调javascript警告框
- 在Yii2中表单验证后的回调Javascript函数
- ASP.Net ThreadPool委托回调——JavaScript不会在回调线程上触发
- 其他函数中的回调 javascript 函数
- robot -递归回调- JavaScript
- 更好的回调Javascript代码在Express/NodeJs