簡體   English   中英

如何在循環的每次迭代中執行 promise.then? Javascript

[英]How to execute promise.then in each iteration of loop? Javascript

我在循環中遇到了 promise 的問題。 我在數據庫中有 10000 行,我想打印前 1000 行,然后獲取 9 個請求來打印 rest。 從技術上講,我想在循環的每次迭代中打印 1000 個結果,為此,我使用 promise 來獲取數據,然后創建 1000 行並打印它。

但問題是,首先 JavaScript 的循環獲取 10 個請求,然后一起執行 10.THEN。

我是說:

1000 results  (First loop)
2000 results (Second loop) - Append 1000 new rows to last 1000.
3000 results (Third loop) - Append 1000 new rows to last 2000.
....

我得到的:

Console.logs 示例

在最后一張圖片中,“第一個 for 循環”收到 10 個請求,當循環完成時,.THEN 打印每個 promise 回調 (.THEN)

那是我的代碼:

fetchData('ArticulosSearch', inputValues).then(function (data) {
        console.log(data);
        var source = getGridSource(url, datafields, "array", data);
        // Creamos el grid con las primeras 1000 rows obtenidas
        $("#GridAseguradora").createGrid(source, dataColumns, params);

        //Obtenemos el nº de registros que tiene la bbdd para calcular cuantas peticiones debe hacer
        setTimeout(() => {
            fetchData('ArticulosSearchCount', inputValues).then(function (total_rows) {
                console.log("count");
                console.log(total_rows);
                var filt = (total_rows[0].Column1 / 1000) //pagines - peticiones
                console.log(filt);

                // Creamos promesa para añadir posteriormente las filas al grid una vez hayan terminado todas las peticiones
                for (var i = 1; i < filt; i++) {
                    (function (i) {
                        console.log("first for loop");
                        inputValues.offset = (1000 * i)
                        fetchData('ArticulosSearch', inputValues).then(function (data) {  //Obtenemos las 1000 siguientes filas y las añadimos a un array
                            console.log("obtain 1000 results");
                            console.log(data);
                            var rows = new Array();

                            data.forEach(el => {
                                rows.push(generaterow(el))
                            });

                            $("#GridAseguradora").jqxGrid('addrow', null, rows); // Agregamos las filas generadas anteriormente al grid
                            $("#GridAseguradora_contRegTotal").text("Reg. Visibles: " + $("#GridAseguradora").jqxGrid('getrows').length)
                        })
                    })(i);
                }
            })
        }, 100);
    })

我想獲得的 Console.logs:

1-first for loop
obtain 1000 results
(append results)

2-first for loop
obtain 1000 results
(append results)

.....

我希望的是客戶看到產品是一點一點加載的,而不是剩下的9000個一起加載

當您運行循環時,您會立即附加.then()子句,因此它們會立即得到解決。 您基本上想要阻止每個循環迭代,直到 promise 解決,然后繼續下一個並重復。

你也可以使用 async / await 來做到這一點,但這里是你如何使用 Promise 實現同步循環迭代:

let promise = Promise.resolve()

for (let i = 0; i < 10; i++) {
  promise = promise.then(() => {
    fetchData('ArticulosSearch', inputValues).then(res => {
       // your logic here
    })
  })
}

您使用Promise.resolve()初始化一個新的 promise 並在每個循環迭代中繼續將then()附加到它。 這些.then()僅在前一個解決后才會執行。

這將確保事情一個接一個地安排妥當。

看看這個片段,我試圖模擬一些需要可變時間來解決的異步操作:

 const outputEl = document.getElementById('output') const fetchSomethingFromDBAsyncFake = (idx) => new Promise((resolve, reject) => { const timeout = setTimeout(() => { outputEl.innerHTML += ` <br /> Loaded chunk ${idx} ` resolve() clearTimeout(timeout) }, 500 + Math.random() * 1750) }) let promise = Promise.resolve() for (let i = 0; i < 10; i++) { promise = promise.then(() => fetchSomethingFromDBAsyncFake(i)) }
 <div id="output"></div>

暫無
暫無

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

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