2017-05-12 114 views
0

這是我的代碼:async.each沒有給出結果?

var shopId=[1,2,3,4]; 
    async.each(shopId,function (item,callback) { 
    model.client.query("SELECT categoryId shopId=? ", [shopId], function (err, rows) { 
     if (rows.length > 0) { 
      var asyncData = rows; 
      //categoryId will be in the format [1,2,3,4] 
      async.each(asyncData,function (item, callback) { 
      var categoryId = item.categoryId; 
      async.series([ 
       function (callback) { 
        model.client.query("select categoryName from category where categoryId = ?", [categoryId], function (err, data) { 
        callback(null, data); 
        }); 
       }], 
       function (err, results) { 
       item.category = results[0]; 
       callback(); 
       }); 
      },function (err) { 
      callback(asyncData); //getting data here 
      }); 
     } 
    }); 
},function (err,result) { 
res.json(result); //not getting data here 
}); 

我是新來aysnc方法。我無法將結果傳遞給最終功能。

+0

你可以在第一個'async'塊之上聲明一個對象,然後在其中添加任何結果,並在最後的回調中使用它。如果你使用express,你可以使用'req'對象。但是你必須在多箇中間件中打破這個代碼塊,它是嵌套的,因此更容易出錯並且難以理解。 –

+0

使用'async.map'而不是''' –

+0

你使用的是mysql嗎?我認爲你的代碼可以得到更清潔 –

回答

0

假設有一個shop表,您可以加入您的表以保存查詢。

const sql = 'select categoryName from category as c inner join shop as s on c.categoryId = s.categoryId where s.shopId = ?'

然後

const shopId = [1, 2, 3, 4]; 
const finalResult = []; 
async.each(shopId, function(item, callback) { 
    model.client.query(sql, [shopId], function (err, rows) { 
    // do not forget error handling ! 
    if (rows.length > 0) { 
     finalResult.push(rows); 
     return callback(); 
    } 
    return callback(); // do not forget to return callback in every case 
    }); 
}, function(err) { // in async each callback, you only get errors 
    if (err) 
    return res.json(err); // or whatever error handling 
    res.json(finalResult); 
}); 

此外,考慮你的代碼,我會建議名稱不同的回調,以避免錯誤或忘記。即

async.each([], function(item, cbkGlobal) { 
    async.each([], function(item, cbkEach) {}); 
}); 

而且async.series是有用的,當你想多個功能得到順序執行。但是在這裏你只執行一個函數...