[英]Callback until for loop with query is done
我之前發布了一個問題,意識到我的問題實際上是異步函數。 我設法解決了大部分問題,但還有一個小問題。 使用異步,我使用瀑布創建了一些查詢的順序...
exports.getMenu = function(id_restaurant, callback){
async.waterfall([
async.apply(firstQuery, id_restaurant),
secondQuery,
thirdQuery,
fourthQuery,
formMenu
], function(err, result){
if(err){
console.log(err);
}
callback(result);
});
};
一切工作一直到fourthQuery
為止,在這里我必須循環獲取菜單的所有菜餚。
function fourthQuery(array_totalP, array_nombresSecc, array_secciones, callback){
var size = array_nombresSecc.length;
var array_secciones = array_secciones;
var array_nombresSecc = array_nombresSecc;
var dishes = [];
pool.getConnection(function(err, connection) {
if(err) {
console.log(err);
callback(true);
return;
}
for (var i = 0; i < size; i++) {
connection.query("SELECT name, price FROM menu_product WHERE id_seccion = ? AND active = 1", [array_secciones[i]],
function(err, results2) {
if(err) {
console.log(err);
callback(true);
return;
}
console.log("Result query 4 " + JSON.stringify(results2));
dishes[i] = results2;
console.log("VALOR PLATILLOS EN i : " + JSON.stringify(dishes[i]));
// this prints the result but only if it has a value over 2
});
};
}); // pool
console.log("I'm sending " + dishes); // this logs an empty array
callback(null, dishes, array_nombresSecc);
};
因此,我看到從每個循環打印'i'值開始發生的事情是它始終具有2值。因為那是'size'值。 另外,即使它保存索引'2'的結果,我也相信即使在for循環完成之前回調也已完成,因為我的第五個函數正在接收一個空數組。
我如何讓我的代碼等待回調,直到我的for循環完成?
注意:對不起,我的代碼的一部分是西班牙語,試圖翻譯其中的重要部分。
有幾種處理方法,一種是研究promise體系結構。 Promise.all將允許您提供一個回調來處理每個子諾言中的值。
要使用您已經擁有的內容,我會將值推入您的餐具數組中,而不是將其專門分配給i
索引,然后在每個連接的末尾檢查該數組的大小。 當數組長度與大小匹配時,觸發回調。 (如下所示)
如果您需要一種將每個結果綁定到特定i
值的方法,建議您將它們作為對象推送
dishes.push({'index': i, 'dish': results2})
然后,如果您只需要盤子的數組,則可以按該索引值對數組進行排序並運行map函數。
dishes.sort(function(a,b){ return a.index - b.index; })
dishes = dishes.map(function(a){ return a.dish })
這是經過調整的代碼:
function fourthQuery(array_totalP, array_nombresSecc, array_secciones, callback) { var size = array_nombresSecc.length; var array_secciones = array_secciones; var array_nombresSecc = array_nombresSecc; var dishes = []; pool.getConnection(function(err, connection) { if (err) { console.log(err); callback(true); return; } for (var i = 0; i < size; i++) { connection.query("SELECT name, price FROM menu_product WHERE id_seccion = ? AND active = 1", [array_secciones[i]], function(err, results2) { if (err) { console.log(err); callback(true); return; } console.log("Result query 4 " + JSON.stringify(results2)); dishes.push(results2) if(dishes.length == size){ console.log("I'm sending " + dishes); callback(null, dishes, array_nombresSecc) } console.log("VALOR PLATILLOS EN i : " + JSON.stringify(dishes[i])); // this prints the result but only if it has a value over 2 }); }; }); // pool ; };
由於您已經在使用async,因此建議fourthQuery
使用async.each()
替換fourthQuery
的for()
循環。
更新后的fourthQuery
將如下所示:
function fourthQuery(array_totalP, array_nombresSecc, array_secciones, callback){ var size = array_nombresSecc.length; var array_secciones = array_secciones; var array_nombresSecc = array_nombresSecc; var dishes = []; pool.getConnection(function(err, connection) { if(err) { console.log(err); callback(true); return; } async.each(array_secciones, function(item, itemCallback) { // Function fun for each item in array_secciones connection.query("SELECT name, price FROM menu_product WHERE id_seccion = ? AND active = 1", [item], function(err, results2) { if(err) { console.log(err); return itemCallback(true); } console.log("Result query 4 " + JSON.stringify(results2)); dishes.push(results2); console.log("VALOR PLATILLOS EN i : " + JSON.stringify(dishes[dishes.length-1])); // this prints the result but only if it has a value over 2 return itemCallback(); }); }, function(err) { // Function run after all items in array are processed or an error occurs console.log("I'm sending " + dishes); // this logs an empty array callback(null, dishes, array_nombresSecc); }); }); // pool };
另外,您可以使用async.map()
,該函數將處理結果收集到最終的回調中,因此無需依賴dishes
變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.