gpt4 book ai didi

javascript - 有没有办法让代码块本身非阻塞

转载 作者:搜寻专家 更新时间:2023-11-01 00:46:36 25 4
gpt4 key购买 nike

在大量使用 node 之后,我不得不习惯以非阻塞方式编写代码,但我能做到这一点的主要方式是使用本身是异步的函数。例如:stat(f,callback)forEach(array, callback) 它们会自动从我认为是主要执行高速公路的地方获取你给它们的任何回调并在被调用后立即返回。

我想知道的是:我怎样才能告诉 ECMA 引擎异步执行一个函数,不管它是什么?

我的特殊用例涉及在 DOM childList 上迭代 for 循环以解析数千个元素;我的问题是每个其他元素都是一个我想跳过的文本 Node 。虽然我会使用 forEach() 这不是最好的,但我只看到 for(a,i=0;a=table[i];i=i+2){/*process 'a'*/> 能够以阻塞为代价纠正该错误。最好的行动方案是什么?

奖励问题:在 JS 必须承担繁重工作的用例中,NodeJS 的编码实践是否适用于客户端应用程序?

最佳答案

注意:Array.prototype.forEach 是同步的,不是异步的。 JS 标准 (ECMAScript 5th edition) 中定义的任何内容都不能是异步的,因为该标准未定义异步语义(Node.js 和 DOM 定义)。

您可以使用 setTimeout (适用于浏览器和 Node.js)或 process.nextTick (特定于 Node.js):

for (...) {
doWorkAsync(...);
}

function doWorkAsync(...) {
setTimeout(doWorkSync.bind(null, ...), 0);
}

function doWorkSync(...) {
...
}

如果您选择利用闭包,那么在使用自由变量时要小心,因为当您的回调最终被调用时,变量可能会发生变化。

使用异步框架,例如 Q by kriskowal (跨 Node.js 和现代浏览器可移植),您可以进行 mapreduce 风格的编程:

var Q = require('q');  // npm package 'q'

function getWorkloads() {
var workloads = [ ];
for (...) {
workloads.push(Q.fcall(doWorkSync.bind(null, ...)));
}
return workloads;
}

Q.all(getWorkloads()).then(function (results) {
// results array corresponds to
// the array returned by getWorkloads.
});

关于javascript - 有没有办法让代码块本身非阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10775935/

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