2017-01-26 72 views
0

我對nodejs仍然很陌​​生,並且正在開發自己的異步功能。根據堆棧跟蹤,我正在看,我被告知下面的代碼被回調兩次。特別是catch catchback。nodejs錯誤:回調已被調用

有沒有更好的方法來構造這個,所以如果試驗中有多個變量發出它只回調一次?

就在我所知道的情況下,因爲所有的緩衝區讀取都是異步完成的,如果出現多個錯誤,他們都會在幾乎同時調用catch的同時造成我的錯誤。至少那是我能想到的唯一會導致這個錯誤的事情,但對於我的生活,我想不出一個辦法。

function fun1(buffer_1, ushort_Type, cb){ 
    cb = (typeof cb === 'function' ? cb : function(){}); 
    var jsonData = {}; 

    try{ 
     var uint_val1 = buffer_1.readUInt32LE(4); 
     var string1_val2 = buffer_1.toString('utf8', 12, 45); 
     var ubyte_val3 = buffer_1.readUInt8(46); 

     jsonData.Type = ushort_Type; 
     jsonData.val1 = uint_val1; 
     jsonData.val2 = string1_val2; 
     jsonData.val3 = ubyte_val3; 

     cb(null, jsonData); 
    }catch(err){ 
     cb(err); //ln 393 
    } 
} 

錯誤堆棧跟蹤。

FolderWatcher-3 [26/01/2017 17:16:45.898] [ERROR] Error: Callback was already called. 
FolderWatcher-3  at C:\nodeCode\FolderWatcher\node_modules\async\dist\async.js:837:36 
FolderWatcher-3  at C:\nodeCode\FolderWatcher\parse.js:116:10 
FolderWatcher-3  at fun1 (C:\nodeCode\FolderWatcher\parse.js:393:4) 
FolderWatcher-3  at C:\nodeCode\FolderWatcher\parse.js:114:8 
FolderWatcher-3  at C:\nodeCode\FolderWatcher\node_modules\async\dist\async.js:4637:20 
FolderWatcher-3  at replenish (C:\nodeCode\FolderWatcher\node_modules\async\dist\async.js:871:21) 
FolderWatcher-3  at C:\nodeCode\FolderWatcher\node_modules\async\dist\async.js:881:15 
FolderWatcher-3  at eachLimit (C:\nodeCode\FolderWatcher\node_modules\async\dist\async.js:4662:33) 
FolderWatcher-3  at Object.<anonymous> (C:\nodeCode\FolderWatcher\node_modules\async\dist\async.js:930:20) 
FolderWatcher-3  at process (C:\nodeCode\FolderWatcher\parse.js:87:10) 

調用功能

//fun1 
    // var eventJSON = {}; 
    if (eventJSON.fun1 === undefined) { eventJSON.fun1 = [];} 
    fun1(frameBuffer, ushort_FrameType, function(err, result){ //ln 114 
     if(err){ 
      callback(err); //ln 116 
     }else{ 
      eventJSON.fun1.push(result); 
      callback(null); 
     } 
    }); 
+0

你是正面的讀取是異步的嗎?我檢查了文檔,但似乎沒有可以傳遞給這些方法的回調參數。 代碼的其餘部分有什麼可能不止一次地調用fun1? 如果try語句中的讀取是異步的,那麼嘗試和實現promise可能是有意義的。這正是我能想到的。 –

+0

我不知道它的異步或不....這是我無法弄清楚發生了什麼的一個原因。 – shaun

+0

你能詳細說明eventJSON嗎?這是來自頁面的ajax調用嗎?這很難說,但我的第一本能是確定fun1是否被多次調用,因爲這看起來是最簡單的解釋。 –

回答

0

我想我已經想通了....

通過移動cb(null, jsonData);只是在try catch塊,因此捕捉後會發生外(ERR )而不是之前,我再也看不到同樣的錯誤了。

function fun1(buffer_1, ushort_Type, cb){ 
    cb = (typeof cb === 'function' ? cb : function(){}); 
    var jsonData = {}; 

    try{ 
     var uint_val1 = buffer_1.readUInt32LE(4); 
     var string1_val2 = buffer_1.toString('utf8', 12, 45); 
     var ubyte_val3 = buffer_1.readUInt8(46); 

     jsonData.Type = ushort_Type; 
     jsonData.val1 = uint_val1; 
     jsonData.val2 = string1_val2; 
     jsonData.val3 = ubyte_val3; 
    }catch(err){ 
     return cb(err); 
    } 
    cb(null, jsonData); 
}