簡體   English   中英

async.whilst用於什么回調和錯誤?

[英]What is the callback and err in async.whilst used for?

我正在嘗試使用async.whilst重新生成0和數組長度之間的隨機數,直到此索引上的元素長度大於指定長度。 我想使用async.whilst,但語法並不完全清楚。 我考慮過做以下事情:

var selectParagraph = function(paragraphs, callback){
    var index = Math.floor(Math.random() * paragraphs.length
    async.whilst(
        function(){ 
            return paragraphs[index].length < minParagraphLength; 
        },
        function(cb) {
            index = Math.floor(Math.random() * paragraphs.length);
        },
        function(err) {
            console.log(paragraphs[index]);
            callback(err, paragraphs[index]);
        }
    }

但是,這不起作用。 我想這是因為我沒有在任何地方使用cb作為第二個函數,但我不知道應該如何使用它。 我只是在更改索引后調用cb()嗎? 變量err究竟包含什么?

我想這是因為我沒有在任何地方使用第二個函數的回調

對,就是這樣。 async.js希望你在完成后回調,如果不這樣做,它將不會繼續下一次迭代。

但我不知道應該如何使用它

你根本不應該使用它,因為你什么都不做。 使用標准do while循環:

do {
    var index = Math.floor(Math.random() * paragraphs.length); 
} while (paragraphs[index].length < minParagraphLength)
console.log(paragraphs[index]);

callback(null, paragraphs[index]); // not sure where you're getting `callback` from

正如BERGI已經指出的 ,你沒有做任何事情異步,並不需要使用whilst在所有。 我想進一步解決您了解如何具體的困惑whilst作品,但是。

whilst的第二個參數是一個可以執行異步操作的函數。 whilst無法知道函數何時“完成”它需要做的一切。 回調參數是一種信號發送方式, whilst該功能已完全完成其所有任務, whilst可以進行下一次迭代。

假設我們想要每隔一秒發出一系列控制台消息。 (這是一個非常人為的例子,但我想不出一個更容易解釋的自然例子。)

var i = 0;
async.whilst(
    function(){ return i < 5; },

    function(cb) {
        setTimeout(function() {
            console.log(i++);
            cb();
        }, 1000);
    },

    function(err) { console.err("we encountered an error", err); }
);

在這種情況下,我們所說setTimeout ,然后whilst不執行下一次迭代直到cb()被調用的setTimeout分辨率。 如果whilst函數終止whilst運行下一次迭代,則所有setTimeout調用將同時排隊,而不是一個接一個地運行。 相反,它一直等到函數調用cb()

因為你從不在代碼中調用cb()whilst只是假設函數已經調度了一個需要很長時間的異步任務。 whilst第一次函數調用確認通過調用cb()完成,但不會運行下一次迭代。

對沒有參數的cb()調用表明該函數沒有任何問題地完成了它的任務。 如果函數以錯誤結束(無法讀取文件,無法訪問網絡資源),那么您可以將該錯誤作為參數提供給cb (例如cb(new Error("could not reach the server")); )並將錯誤提供給whilst的第三個函數參數。

暫無
暫無

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

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