JS中按照順序依次執行多個非同步任務

2022-06-05 06:48:09 字數 1979 閱讀 8685

一、問題描述

二、思路

乙個請求完成之後再傳送下乙個請求,關鍵在於傳送乙個之後先停下來等待該請求完成,處理之後再繼續下乙個請求。生成器generator裡面的yield語句可以分割**,程式遇到yield會停住,通過next語句可以一次執行乙個yield分割的語句,本文嘗試使用生成器完成依次傳送多個請求的功能。

生成器示例如下:

1

//生成器通過函式名前加*建立

2function *generatorfn() 6//

呼叫生成器

7 let g =generatorfn();8//

通過next方法執行,返回yield後面的值,且整個生成器未執行完之前done為false

9 console.info(g.next()); //

10 console.info(g.next()); //

11//

執行完之後value為undefined,done為true

12 console.info(g.next()); //

13 console.info(g.next()); //

三、步驟通過依次傳送100個不同的請求來介紹,首先先把100個請求放入生成器內:

1 let baseurl = '';

2function*generator()

6 }

接下來要先呼叫next()開始乙個yield語句,讓請求傳送出去,然後處理好結果後再次呼叫next(),如此迴圈,知道next()返回done: true,通過遞迴實現如下:

1

function

run(res) );10}

11}1213

//開始執行

14 let gen =generator();

15 run(gen.next());

可以觀察到頁面中會按照請求傳送的順序輸出結果如下:

完整**如下:

1

2343

44

四、其他實現1.通過promise的then實現。先得到乙個成功的promsie,每次迴圈在promise.then裡面返回乙個新的promise,在新promise內傳送請求,待請求成功後再resolve新promise,這樣下一次then的時候一定是上次resolve之後

function

ajaxquene() )

})})

}}ajaxquene();

下面的分步驟**會比較直接:

let promise =promise.resolve();

promise = promise.then((v) =>);

});});// 這個then的執行必定是上個返回的promise在請求完成呼叫resolve之後

promise = promise.then((v) =>);

});});promise = promise.then((v) =>);

});});

2.await會強制其他**等待,直到後面的promise執行完畢,可以使用async和await完成類似功能:

1

//使用async和await

2 let baseurl = '';

3 async function

ajax() )

10 .catch((err) => );13}

14}15 ajax();

以上專案中需要依次傳送非同步請求的實現方法,js非同步的發展就是讓非同步處理起來越來越像同步。

js多個非同步請求,按順序執行next

在js裡面,偶爾會遇見需要多個非同步按照順序執行請求,又不想多層巢狀,這裡和promise.all的區別在於,promise或者jquery裡面的 when 是同時傳送多個請求,一起返回,發出去的順序是一起 這裡是按照順序發請求 方法 一 首先建立乙個迭代器,接收任意多個函式引數 function ...

多個非同步請求保證執行順序 用遞迴

我們在程式設計的過程中可能會使用到一些非同步的請求,而且可能會有多個,並且前後之後可能會有某種依賴 必須前乙個執行成功,後面的才去呼叫,否則直接失敗。這種問題的解決方案就是遞迴。專案背景 我使用是vertx框架,主要是解決了發布多個模組的問題。vertx框架不知道沒有關係,只需要了解它在啟動的過程中...

js非同步之間執行的順序

今天同事問了乙個問題,怎麼讓ajax中的 保持非同步 先執行,再讓普通的function執行。整了個解決辦法 如下 將同步 放入settimeout中,變成非同步,則和ajax中的 同為非同步,則按照非同步的方式來排列執行順序。由此引入非同步之間的執行順序問題!首先常見的非同步一般有 ajax可以非...