簡體   English   中英

while循環內的JavaScript回調不起作用?

[英]Javascript callback within a while loop does not work?

我正在嘗試在javascript中進行事件驅動的while循環。 本質上,它會迭代一個值數組,並在每次迭代期間進行查詢。 然后,根據查詢結果,它應該繼續循環或停止並執行某些操作。

我意識到你不能在while循環中有回調,所以我對如何實現這樣的事情感到困惑。 嵌套函數會重復出現,這並不理想。

我的循環代碼:

             var done = false;
             while(!done){
                bridgeCheckRooms(send,function(reply){ //callback
                    console.log(tagArray[count]);
                    console.log(reply);
                    if(reply.success){
                        done = true;
                    } else {
                        count--;
                    }
                });
            }

您應該使用遞歸。 一種方法是這樣的:

     function next() {

            // ....

            bridgeCheckRooms(send,function(reply){ //callback
                console.log(tagArray[count]);
                console.log(reply);
                if(reply.success){
                    // continue() ?
                    // done = true;
                } else {
                    count--;
                    next();
                }
            });
     }

     next();

當然,這只是一個例子。 您應該使它適應您的整個代碼。

如果bridgeCheckRooms是同步的並且阻塞了執行線程,直到返回響應,您的代碼將是正確的。 看到這篇關於同步性的帖子

這是您的代碼中正在發生的事情:

while循環中的代碼塊正在執行bridgeCheckRooms ,我們假設它將做一些工作,然后將對數據庫的異步調用排隊。 然后, bridgeCheckRooms將返回,並且while循環的執行將立即繼續,並將另一個對bridgeCheckRooms調用bridgeCheckRooms

他們的關鍵是bridgeCheckRooms是一個異步函數,並且直到完成后才阻止執行。 因此,當您調用bridgeCheckRooms時,它只是將一個異步調用排隊,但是不會等到完成。

因此,如果while循環執行10次,您將有10個對數據庫的待處理請求。 但是,直到while循環停止執行並讓異步隊列執行后,這些請求才開始執行。

@pablo為此具有正確的代碼方法。 他的代碼和您的代碼之間的區別在於,在第一個異步調用完成之前,不會進行第二個異步調用。

編輯: CallbackHell.com看起來像是關於這個主題的很棒的入門

我認為您想研究延遲的對象和承諾。 您要等到異步調用完成后再進行檢查,以查看是否需要繼續循環。

或者,如果此處對異步沒有好處,則可以使其成為同步調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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