摘要:今天自己寫小程序的時候,近乎被異步搞到崩潰,不停地嵌套回調我知道和,但是我嫌寫起來跟裹腳布似的,而我怕有兼容性問題也從來沒有試過言歸正傳,將小程序的異步調用變為同步以下教程適用于所有異步,只是給小程序做了一下封裝。
今天自己寫小程序的時候,近乎被異步搞到崩潰,不停地嵌套回調(我知道 await 和 promise,但是我嫌promise寫起來跟裹腳布似的,而await我怕有兼容性問題也從來沒有試過)
言歸正傳,將小程序的異步調用變為同步(以下教程適用于所有異步,只是給小程序做了一下封裝)。
原理:增加事件隊列,采用事件回調來完成同步化
以下代碼復制粘貼到控制臺即可測試效果;
這里直接寫es6代碼了,先寫個定時器版本的方便測試與理解
先寫個無注釋版本的,方便直接看代碼
class Async{ constructor() { this.list = []; this.sock = false; } request(obj) { setTimeout(() => { console.log(obj); this.sock = false; if(this.list[0]) this.do(this.list.shift()); }, 1000) } do(requestObj, sync) { if(!sync) { return this.request(requestObj); } if(this.sock) { this.list.push(requestObj); }else { this.sock = true; this.request(requestObj); } } }
-----------以下為注釋版本-----------
class Async{ constructor() { this.list = []; // 定義 執行隊列 this.sock = false; // 判斷是否有任務正在執行 } request(obj) { setTimeout(() => { console.log(obj); this.sock = false; // 重置為沒有任務正在執行 if(this.list[0]) // 如果隊列中還有任務,執行下一個任務 this.do(this.list.shift()); }, 1000) // 模擬一個異步,一秒后執行任務,執行完成后執行下一個異步任務 } do(requestObj) { if(this.sock) // 如果有任務在執行 this.list.push(requestObj); // 將當前任務其增加到任務隊列 else { this.sock = true; // 否則開始執行當前任務并設定"有任務在執行" this.request(requestObj); } } } var x = new Async(); x.do({url: 1}); // 一秒后打印 url: 1 x.do({url: 2}); // 兩秒后打印 url: 2
但是同步只是異步無可奈何的選擇,所以不能全部否決掉異步
class Async{ constructor() { this.list = []; // 定義 執行隊列 this.sock = false; // 判斷是否有任務正在執行 } request(obj) { setTimeout(() => { console.log(obj); this.sock = false; // 重置為沒有任務正在執行 if(this.list[0]) // 如果隊列中還有任務,執行下一個任務 this.do(this.list.shift()); }, 1000) // 模擬一個異步,一秒后執行任務,執行完成后執行下一個異步任務 } do(requestObj, sync) { if(!sync) // 判斷是否需要同步,如果需要再加入到隊列,不然直接執行 return this.request(requestObj); if(this.sock) // 如果有任務在執行 this.list.push(requestObj); // 將當前任務其增加到任務隊列 else { this.sock = true; // 否則開始執行當前任務并設定"有任務在執行" this.request(requestObj); } } } var x = new Async(); x.do({url: 1}, true); // 一秒后打印 url: 1 x.do({url: 2}, true); // 兩秒后打印 url: 2 x.do({url: 3}); // 一秒后打印 url: 3
然后加入小程序的接口調用方法
class AsyncRequest{ constructor() { this.list = []; // 定義 執行隊列 this.sock = false; // 判斷是否有任務正在執行 } request(obj) { wx.request({ url: obj.url, data: obj.data, header: { "content-type": "application/json" }, success: res => { obj.cb(res); if(this.list[0]) this.do(this.list.shift()); } }) } do(requestObj, sync) { if(!sync) // 判斷是否需要同步,如果需要再加入到隊列,不然直接執行 return this.request(requestObj); if(this.sock) // 如果有任務在執行 this.list.push(requestObj); // 將當前任務其增加到任務隊列 else { this.sock = true; // 否則開始執行當前任務并設定"有任務在執行" this.request(requestObj); } } } var x = new AsyncRequest(); x.do({url: 1, data: {test: 1}, cb: ()=> {}}, true); // 先請求接口1 x.do({url: 2}, true); // 1 請求完成后請求接口2 x.do({url: 3}); // 和 1 同時 發起請求
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/105637.html
摘要:并總結經典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快速搭建項目。 本文是關注微信小程序的開發和面試問題,由基礎到困難循序漸進,適合面試和開發小程序。并總結vue React html css js 經典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快...
摘要:并總結經典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快速搭建項目。 本文是關注微信小程序的開發和面試問題,由基礎到困難循序漸進,適合面試和開發小程序。并總結vue React html css js 經典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快...
摘要:并總結經典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快速搭建項目。 本文是關注微信小程序的開發和面試問題,由基礎到困難循序漸進,適合面試和開發小程序。并總結vue React html css js 經典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快...
摘要:并總結經典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快速搭建項目。 本文是關注微信小程序的開發和面試問題,由基礎到困難循序漸進,適合面試和開發小程序。并總結vue React html css js 經典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快...
閱讀 1125·2021-11-16 11:42
閱讀 2905·2021-10-12 10:18
閱讀 2864·2021-09-24 09:48
閱讀 3466·2019-08-30 15:56
閱讀 1530·2019-08-30 14:17
閱讀 3049·2019-08-29 12:14
閱讀 912·2019-08-27 10:51
閱讀 2030·2019-08-26 13:28