簡體   English   中英

回調直到完成與查詢的循環

[英]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()替換fourthQueryfor()循環。

更新后的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM