序列處理不定數量的非同步請求,並且這些非同步請求有前後依賴關係,我的方案如下:
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提供的乙個物件...