回调在async.map中已经被调用
问题描述:
编辑:“线程”+“异步”模块不是异步(如果不是线程)安全!它被另一个异步函数调用!这就是为什么线程在单个异步完成之前运行两次。有一些代码剩余部分异步调用相同的代码。回调在async.map中已经被调用
下面是一些代码,给出了错误(标有ERROR!
):
async.map(threads, function (thread, cb_) {
zz++,
console.log(zz);
(function (id____) {
thread.msg({ cmd: "compare", data: id____ }, function (result) {
if (result)
compareCheck = false;
console.log(cb_.toString());
// ERROR!
cb_(null, thread); // why?
// return cb_ doesn't solve neighter
});
})(id__);
}, function (err, result) {
if (compareCheck) {
console.log("b:" + Session.cmpCtr);
threads[Session.cmpCtr % nThreads].msg({
cmd: "add", data: id__
}, function (response) {
setImmediate( cbCmp_);
});
}
else {
// whatsoever gives collision, retry new one,
// setImmediate to stop recursion fee on cpu
setImmediate(function() {
id__ = "";
for (var i = 0; i < 24; i++)
id__ += rndChar();
cmpId(id__, cbCmp_);
});
}
});
这段代码做什么,检查是否N个线程(使用线程模块与重生)在自己的列表中有一个会话变量等于新生成的一个,那么如果不存在冲突,则将该新变量添加到线程列表中的一个。如果一个线程的命令是“add”,那么它会将变量添加到列表中,如果命令是“compare”,那么它将根据列表的值和新值在回调中给出真正的错误值。
为什么async.map会给出这个错误?该函数是由所有线程执行的,为什么它不应该被执行多次?这是一个回调。
也许async.map不能有一个线程列表(不可序列化),只是复制它以在每个会话变量生成时拥有更多的多个实例?
线程正在使用由与初始化的包装:
threads.push(new QThread(function (input, done) {
this.data = (typeof this.data === "undefined")? [] : this.data;
if (input.cmd != null && typeof input.cmd !== "undefined") {
if (input.cmd === "add") {
data.push(input.data);
done(true);
}
else if (input.cmd === "compare")
{
for (var i = 0; i < data.length; i++) {
if (data[i] == input.data) {
done(true);
return;
}
}
done(false);
return;
}
}
}));
编辑:return cb_(null, thread);
给出同样的错误。
我想使用async.map,因为使用简单的自旋锁样式同步是cpu资源密集型,并且不适合nodejs。
下面是输出错误:
C:\...\async.js:985
if (fn === null) throw new Error("Callback was already called.");
^
Error: Callback was already called.
at C:\...\async.js:985:32
at C:\...\async.js:1158:13
at C:\...\session.js:79:28
at Worker.<anonymous> (C:\...\qthread.js:25:13)
at Worker.emit (C:\...\index.js:129:35)
at Worker.handleMessage (C:\Users\pc\node_modules\threads\lib\worker.node\worker.js:119:17)
at emitTwo (events.js:106:13)
at ChildProcess.emit (events.js:191:7)
at process.nextTick (internal/child_process.js:744:12)
at _combinedTickCallback (internal/process/next_tick.js:67:7)
答
被称为cb_(null, thread);
后,功能将依然执行剩下的代码。这是更好地终止回调这样
return cb_(null, thread);
这可确保在调用回调,将停止执行,返回的东西。
return cb_(null,thread);在同一行上出现同样的错误 –
在你呼叫回叫的地方放置'return'。 – kawadhiya21
我把文件中的所有回调都放回去了,还是一样的错误同一行。 –