回调在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);

这可确保在调用回调,将停止执行,返回的东西。

+0

return cb_(null,thread);在同一行上出现同样的错误 –

+0

在你呼叫回叫的地方放置'return'。 – kawadhiya21

+0

我把文件中的所有回调都放回去了,还是一样的错误同一行。 –