2017-05-12 5 views
0

Dies ist mein Code:async.each nicht das Ergebnis geben?

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 
}); 

: Ich bin Methoden aysnc. Ich bin nicht in der Lage, das Ergebnis zur endgültigen Funktion zu übergeben.

+0

Sie können ein Objekt über dem ersten Async-Block deklarieren und dann eines der Ergebnisse anhängen und im letzten Callback diesen verwenden. Wenn Sie Express verwenden, können Sie das 'req'-Objekt für dasselbe verwenden. Aber Sie müssen diesen Codeblock in mehreren Middleware brechen, es ist ziemlich verschachtelt und damit fehleranfälliger und schwer zu verstehen. –

+0

Verwenden Sie 'async.map' anstelle von' each' –

+0

verwenden Sie mysql? Ich denke, dass Sie Code viel sauberer bekommen können –

Antwort

0

Angenommen, es gibt eine Tabelle shop, können Sie Ihre Tabellen verbinden, um eine Abfrage zu speichern.

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

dann

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); 
}); 

Auch Ihr Code unter Berücksichtigung, würde ich zu nennen anders Ihre Rückrufe beraten Fehler oder vergisst zu vermeiden. das heißt

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

Und async.series ist nützlich, wenn Sie mehrere Funktionen wollen ausführen, um zu bekommen. Aber hier führen Sie nur eine Funktion aus ...

Verwandte Themen