2015-06-28 30 views
1

我使用異步模塊的forEachOf方法在遍歷對象後打印最終結果。下面是我在做什麼縮短版:在node.js異步模塊的forEachOf方法中未調用可選回調

var async = require('async'), 
    cheerio = require('cheerio'), 
    request = require('request'); 

var returnArray = []; 

async.forEachOf(myObj, function (value, key, callback) { 
    var anotherObj = {}; 

    anotherObj.type = "val1"; 

    request(someurl, function(err, res, body) { 
     if (err) { 
      return callback(err); 
     } 

     var $ = cheerio.load(body); 

     anotherObj.name = "val2"; 

     var miniObj = {}; 
     $('#some-element', "#an-id").each(function(i, value) { 
      var val = value.value; 
      miniObj[size] = val; 
     }); 

     anotherObj.miniObj = miniObj; 

     returnArray.push(anotherObj); 

     return callback(); 
    }); 
}, function (err) { 
    if (err) { 
     console.error(err.message); 
    } 

    console.log(returnArray); 
}); 

然而,當我運行程序,沒有什麼(即「returnArray」)被打印到控制檯像它應該是。

僅供參考,我已經看過這些,類似的帖子:

我不知道我在做什麼錯在這裏。任何人都可以指出我做錯了什麼?

謝謝!

編輯:所以我想我終於搞清楚我做錯了什麼。在前面提供的另一個示例中,我忘記添加'return callback()'語句。然後它工作。這個例子與這個例子唯一的區別在於,我上面提供的例子中的'return callback()'語句本身在另一個異步方法中被調用。我想爲了解決我的問題,我會在第二個異步方法完成後,以某種方式確保(可能在async的庫中使用某個控制流函數)在正確的'範圍/級別'調用'return callback()'。我認爲我會把這個,我的錯誤歸因於缺乏在異步文檔中正確使用'return callback()'語句的文檔。一旦我弄清楚了,我會用解決方案更新這篇文章(並且趕上一些睡眠)!

+0

'returnObject' vs'returnArray'? – robertklep

+0

糟糕!這只是一個錯字。 – youngrrrr

+0

你的myObj對象的結構是什麼?你確定你不應該使用'async.each'嗎? –

回答

-2

你聲明:

if (err) { 
    return callback(err); 
} 

不適用於異步編程。相反,你應該這樣做:

if(err) callback(err); 

這就是爲什麼你沒有得到任何返回。我改寫了與異步的概念代碼適用於:

var async = require('async'), 
var cheerio = require('cheerio'), 
var request = require('request'); 

var returnArray = []; 
async.forEachOf(myObj, function (value, key, next) { 
    var anotherObj = {}; 

    anotherObj.type = "val1"; 

    request(someurl, function(err, res, body) { 
     if (err) next(err); 

     var $ = cheerio.load(body); 

     anotherObj.name = "val2"; 

     var miniObj = {}; 
     async.each($('#some-element', "#an-id"), function (value, next) { 
      var val = value.value; 
      miniObj[size] = val; 
     }); 

     anotherObj.miniObj = miniObj; 

     returnArray.push(anotherObj); 

     next(); 
    }); 
}, function (err) { 
    if (err) console.error(err.message); 

    console.log(returnArray); 
    callback(returnArray); 

}); 

請注意,您有兩個不同的命名回調。外部函數回調被稱爲callback。內部函數回調稱爲next

+2

這是完全錯誤的。建議在回調不是你函數中的最後一個語句的情況下使用回調回調,在這種情況下,你會得到「回調被調用兩次」的錯誤。 – derek