不定量非同步請求的序列處理

2022-08-29 09:51:08 字數 1442 閱讀 5449

序列處理不定數量的非同步請求,並且這些非同步請求有前後依賴關係,我的方案如下:

es6中引入了generator函式,它是用來處理非同步任務的。呼叫generator函式會返回乙個iterator物件,通過iterator的方法控制generator的內部執行,達到執行掛起、執行恢復的效果。

第一步:將乙個擁有**函式的非同步請求函式封裝為乙個只需要傳**函式的單引數函式(函式的curring,如果我沒記錯),**如下:

//這是乙個正常的非同步函式

mysql.query('select...', callback)

//單引數版本

const thunk = function (querystr)

};const thunkquery = thunk('select...');

第二步:定義乙個generator函式

const queryarr = ['select...', 'select...', ...];

function* gen(queryarr, limit) while (i < length && results.length < limit )//這裡可以加其他讓generator停下來的條件

return results;

}

第三步:定義乙個控制generator執行流程的管理器

function autorun(fn) else 

}iterator.next(handler);

}

第三步的關鍵點是每一步的非同步請求結束後,將結果返回給genrator,由genrator管理請求的結果資料,並且generator再次返回乙個只需傳**函式的單引數請求函式

2023年4月8日,重讀以前的文章發現有一些錯誤,特將上面錯誤修正。並且在es2017的推出以及babel和traceur等轉譯工具的廣泛使用。現在,非同步序列處理有了更好的解決方案,通過async函式,可以用同步的寫法處理非同步任務。將上面的例子進行改寫

第一步:將擁有**函式的非同步函式轉化為乙個返回promise物件的函式,現在大部分非同步任務都提供了peomise介面,為了讓一些老舊api做到相容promise,因此做個簡單展示

mysql.query = function(querystr) 

return sesolve(data);

})});

}

第二步使用asyn函式,以同步寫法描述非同步序列任務,在每個返回promise的非同步任務前,新增await關鍵字

const querystr = ['select...', 'select...', ...];

(async function() while (i < length && results.length < limit )

})()

非同步請求的處理方案

iterator 的作用有三個 一是為各種資料結構,提供乙個統一的 簡便的訪問介面 二是使得資料結構的成員能夠按某種次序排列 三是 es6 創造了一種新的遍歷命令for.of迴圈,iterator 介面主要供for.of消費。方法next 首先執行第一次next 方法,指標物件iterator中的第...

如何實現web請求的非同步處理

目前,我們編寫的 基本上都是同步請求的,我們每次請求,都會站喲過客戶端的乙個資源,乙個鏈結,導致連線數減少。如何進行非同步處理,那麼我們處理的速度會大大的增加。方法一 servlet3.0後,我們的servlet支援了非同步請求的方式來執行我們的業務邏輯。通過request.startasync r...

promise處理多個相互依賴的非同步請求

在專案中,經常會遇到多個相互依賴的非同步請求。如有a,b,c三個ajax請求,b需要依賴a返回的資料,c又需要a和b請求返回的資料。如果採用請求巢狀請求的方式自然是不可取的。導致 難以維護,如何請求很多。會出現很多問題。promise就是解決多個非同步請求的問題。promise是es6提供的乙個物件...