在js裡面,偶爾會遇見需要多個非同步按照順序執行請求,又不想多層巢狀,,這裡和promise.all的區別在於,promise或者jquery裡面的$.when 是同時傳送多個請求,一起返回,發出去的順序是一起;這裡是按照順序發請求
方法 一 、首先建立乙個迭代器,接收任意多個函式引數
function
nextregister()
;function
nexttime()
}}if(args[count]
&& object.prototype.tostring.
call
(args[count])==
'[object function]'
)}
建立多個非同步的函式,注入到迭代器中
/*
comm:多個函式,公用的變數
next:呼叫下乙個函式
* */
function
fn1(comm,next)
function
fn2(comm,next)
function
fn3(comm,next)
//開始執行迭代
nextregister
(fn1,fn2,fn3)
;
在這裡,fn1-fn3函式中,做非同步操作,知道在非同步成功的時候呼叫next()就可以繼續執行下乙個函式,同時可以將前面函式返回的結果,繫結在comm上,帶到下乙個函式中
方法 二、參考express 和 koa 的寫法
1、es5寫法
function
iterator()
iterator.prototype.
use=
function
(fn)
iterator.prototype.
run=
function
(ctx);}
let len =
this
.middlewares.length;
letnext
=function()
;for
(let i = len -
1; i >=
0; i--
)next()
;}var iterator =
newiterator()
;iterator.
use(
function
(ctx,next));
iterator.
use(
function
(ctx,next));
iterator.
run(
);
2、es6 的 async 寫法
class
iterator
use(fn)
async
run(ctx)
}let len =
this
.middlewares.length;
let next =
async()
=>
;for
(let i = len -
1; i >=
0; i--
)await
next()
;}}new
iterator()
;use
(async
(ctx,next)
=>);
use(async
(ctx,next)
=>);
run(
);
多個非同步請求保證執行順序 用遞迴
我們在程式設計的過程中可能會使用到一些非同步的請求,而且可能會有多個,並且前後之後可能會有某種依賴 必須前乙個執行成功,後面的才去呼叫,否則直接失敗。這種問題的解決方案就是遞迴。專案背景 我使用是vertx框架,主要是解決了發布多個模組的問題。vertx框架不知道沒有關係,只需要了解它在啟動的過程中...
JS中按照順序依次執行多個非同步任務
一 問題描述 二 思路 乙個請求完成之後再傳送下乙個請求,關鍵在於傳送乙個之後先停下來等待該請求完成,處理之後再繼續下乙個請求。生成器generator裡面的yield語句可以分割 程式遇到yield會停住,通過next語句可以一次執行乙個yield分割的語句,本文嘗試使用生成器完成依次傳送多個請求...
原生js 非同步請求
1 非同步請求的方法 iframe script xmlhttprequest comet 伺服器端發起 兩個必須的引數。get post 等,不區分大小寫,但通常用大寫字母來匹配http協議 想要快取資料時,最好使用get方法。如果傳false為其第三個引數,則該方法變為同步獲取資料,但一般不能這...