一、問題描述
二、思路
乙個請求完成之後再傳送下乙個請求,關鍵在於傳送乙個之後先停下來等待該請求完成,處理之後再繼續下乙個請求。生成器generator裡面的yield語句可以分割**,程式遇到yield會停住,通過next語句可以一次執行乙個yield分割的語句,本文嘗試使用生成器完成依次傳送多個請求的功能。
生成器示例如下:
1三、步驟通過依次傳送100個不同的請求來介紹,首先先把100個請求放入生成器內://生成器通過函式名前加*建立
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()); //
1 let baseurl = '';接下來要先呼叫next()開始乙個yield語句,讓請求傳送出去,然後處理好結果後再次呼叫next(),如此迴圈,知道next()返回done: true,通過遞迴實現如下:2function*generator()
6 }
1可以觀察到頁面中會按照請求傳送的順序輸出結果如下:function
run(res) );10}
11}1213
//開始執行
14 let gen =generator();
15 run(gen.next());
完整**如下:
12343
44
四、其他實現1.通過promise的then實現。先得到乙個成功的promsie,每次迴圈在promise.then裡面返回乙個新的promise,在新promise內傳送請求,待請求成功後再resolve新promise,這樣下一次then的時候一定是上次resolve之後
function下面的分步驟**會比較直接:ajaxquene() )
})})
}}ajaxquene();
let promise =promise.resolve();2.await會強制其他**等待,直到後面的promise執行完畢,可以使用async和await完成類似功能:promise = promise.then((v) =>);
});});// 這個then的執行必定是上個返回的promise在請求完成呼叫resolve之後
promise = promise.then((v) =>);
});});promise = promise.then((v) =>);
});});
1以上專案中需要依次傳送非同步請求的實現方法,js非同步的發展就是讓非同步處理起來越來越像同步。//使用async和await
2 let baseurl = '';
3 async function
ajax() )
10 .catch((err) => );13}
14}15 ajax();
js多個非同步請求,按順序執行next
在js裡面,偶爾會遇見需要多個非同步按照順序執行請求,又不想多層巢狀,這裡和promise.all的區別在於,promise或者jquery裡面的 when 是同時傳送多個請求,一起返回,發出去的順序是一起 這裡是按照順序發請求 方法 一 首先建立乙個迭代器,接收任意多個函式引數 function ...
多個非同步請求保證執行順序 用遞迴
我們在程式設計的過程中可能會使用到一些非同步的請求,而且可能會有多個,並且前後之後可能會有某種依賴 必須前乙個執行成功,後面的才去呼叫,否則直接失敗。這種問題的解決方案就是遞迴。專案背景 我使用是vertx框架,主要是解決了發布多個模組的問題。vertx框架不知道沒有關係,只需要了解它在啟動的過程中...
js非同步之間執行的順序
今天同事問了乙個問題,怎麼讓ajax中的 保持非同步 先執行,再讓普通的function執行。整了個解決辦法 如下 將同步 放入settimeout中,變成非同步,則和ajax中的 同為非同步,則按照非同步的方式來排列執行順序。由此引入非同步之間的執行順序問題!首先常見的非同步一般有 ajax可以非...