簡體   English   中英

打字稿-諾言的循環

[英]typescript - while loop for promise

我有一個大數組,分成幾個小塊。 然后,我在每個塊上進行異步調用:

  myFunc(arrObjs: any[], chunkSize: number): Promise<any> {
    let result = Promise.resolve(); // To start the chain

    while(arrObjs.length) {
      // Extracting array chunk
      let chunk = arrObjs.splice(0, chunkSize);
      // Building the chain
      result = result.then(() => {
        return someAsynFunc(
          chunk
        );
      });
    }
    return result;
  }

在我的解決方案之上。 我需要按順序(系列承諾)運行異步函數,因此我建立了一個承諾鏈。

有沒有更好的方法可以做到這一點?

是的,您可以使用reduce模式:

function myFunc(arrObjs: any[], chunkSize: number): Promise<any> {
    const chunks : any[] = [];
    while (arrObjs.length) {
        chunks.push(arrObjs.splice(0, chunkSize));
    }

    return chunks.reduce((p : Promise<any>, chunk : any[]) => {
        return p.then(() => someAsyncFunc(chunk));
    }, Promise.resolve());
  }

(我認為我正確地使用了這些類型注釋;如果沒有,希望您可以閱讀過去...)

請注意,我保留了您原來的行為,實際上是從arrObjs數組中刪除了數據,但通常我不主張像這樣更改從調用方傳遞的對象。

這是一個例子:

 function myFunc(arrObjs, chunkSize) { const chunks = []; while (arrObjs.length) { chunks.push(arrObjs.splice(0, chunkSize)); } return chunks.reduce((p, chunk) => { return p.then(() => someAsyncFunc(chunk)); }, Promise.resolve()); } function someAsyncFunc(chunk) { console.log("Start handling", JSON.stringify(chunk)); return new Promise(resolve => { setTimeout(() => { console.log("Done handling", JSON.stringify(chunk)); resolve(); }, 800); }); } const array = [0, 1, 2, 4, 5, 6, 7, 8, 9]; myFunc(array, 3).then(() => { console.log("Done"); }); 


還要注意,上面處理它們之前先從數組刪除了所有塊。 如果你想這樣做, 因為他們正在處理(與任何產生串擾其他使用該數組,這可能添加/刪除/等),你可以做同樣的事情,只是沒有reduce

// Cross-talky version
function myFunc(arrObjs : any[], chunkSize : number) : Promise<any> {
  return new Promise<any>(function processChunk(resolve : function) {
    const chunk : any[] = arrObjs.splice(0, chunkSize);
    if (chunk.length == 0) {
      resolve();
    } else {
      someAsyncFunc(chunk).then(() => processChunk(resolve));
    }
  });
}

 // Cross-talky version function myFunc(arrObjs, chunkSize) { return new Promise(function processChunk(resolve) { const chunk = arrObjs.splice(0, chunkSize); if (chunk.length == 0) { resolve(); } else { someAsyncFunc(chunk).then(() => processChunk(resolve)); } }); } function someAsyncFunc(chunk) { console.log("Start handling", JSON.stringify(chunk)); return new Promise(resolve => { setTimeout(() => { console.log("Done handling", JSON.stringify(chunk)); resolve(); }, 800); }); } const array = [0, 1, 2, 4, 5, 6, 7, 8, 9]; myFunc(array, 3).then(() => { console.log("Done"); }); setTimeout(() => { array.splice(2, 0, 'cross', 'talk'); }, 1000); 

暫無
暫無

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

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