亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

微信小程序中使用Promise進行異步流程處理的實例詳解

2019-11-19 15:45:52
字體:
來源:轉載
供稿:網友

微信小程序中使用Promise進行異步流程處理的實例詳解

我們知道,JavaScript是單進程執行的,同步操作會對程序的執行進行阻塞處理。比如在瀏覽器頁面程序中,如果一段同步的代碼需要執行很長時間(比如一個很大的循環操作),則頁面會產生卡死的現象。

所以,在JavaScript中,提供了一些異步特性,為程序提供了性能和體驗上的益處,比如可以將代碼放到setTimeout()中執行;或者在網頁中,我們使用Ajax的方式向服務器端做異步數據請求。這些異步的代碼不會阻塞當前的界面主進程,界面還是可以靈活的進行操作,等到異步代碼執行完成,再做相應的處理。

一段典型的異步代碼類似這樣:

function asyncFunc(callback) { setTimeout(function () {  //在這里寫你的邏輯代碼  //...  //邏輯代碼結束,執行一個回調函數  callback(); }, 5000);}

或者:

function getAccountInfo(callback, errorCallback) { wx.request({  url: '/accounts/12345',  success: function (res) {   //...   callback(data);  },  fail: function (res) {   //...   errorCallback(data);  } });}

然后我們這樣調用:

asyncFunc(function () { console.log("asyncFunc() run complete");});getAccountInfo(function (data) { console.log("get account info successfully:", data);}, function () { console.error("get account info failed");});

這是一種使用了回調函數來控制代碼執行流程的方式。這樣看起來沒問題,也挺容易理解。

但是,如果我們一段代碼中,異步操作太多,又要保證這些異步操作是有順序的執行,那我們的代碼就看起來非常糟糕,就像這樣:

asyncFunc1(function(){ //... asyncFunc2(function(){  //...  asyncFunc3(function(){   //...   asyncFunc4(function(){    //...    asyncFunc5(function(){      //...    });   });  }); });});

這樣的代碼可讀性和可維護性可想而知了。還有,回調函數真正的問題在于:

它剝奪了我們使用 return 和 throw 這些關鍵字的能力。

那有什么辦法來改善這個問題呢?答案是肯定的,Promise這種概念的產生,很好地解決了這一切。關于什么是Promise,一搜一大把介紹,我這里就不復制粘貼了,我主要是講一下我們怎么用它來解決我們的問題。

我們來看一下,上面的例子如果使用Promise,它會是什么樣子?我們先將這些函數變成Promise的方式:

function asyncFunc1(){ return new Promise(function (resolve, reject) {  //... })} // asyncFunc2,3,4,5也實現成跟asyncFunc1一樣的方式...

然后看一下他們是怎么樣被調用的:

asyncFunc1() .then(asyncFunc2) .then(asyncFunc3) .then(asyncFunc4) .then(asyncFunc5);

這樣,這些異步函數就會按照順序一個一個依次執行了。

ES6中原生支持了Promise,不過在原生不支持Promise的環境中,我們有很多第三方庫來支持,比如Q.js和Bluebird。它們一般都除了提供標準Promise的API外,還提供了一些標準之外但非常有用的API,使得異步流程的控制更加優雅。

從微信小程序的API文檔中我們可以看到,框架提供的JavaScript API中很多函數其實都是異步的,如wx.setStorage(), wx.getStorage(), wx.getLocation()等等,它們也是提供的回調的處理方式,在參數中傳入success, fail,complete回調函數,就可以對運行成功或失敗進行分別處理。

如:

wx.getLocation({  type: 'wgs84',  success: function(res) {   var latitude = res.latitude   var longitude = res.longitude   var speed = res.speed   var accuracy = res.accuracy  }, fail: function() {  console.error("get location failed") }})

我們能不能讓微信小程序的異步API支持Promise呢?答案是肯定的,我們當然可以一個一個的用Promise去包裝這些API,但是這個還是比較麻煩的。不過,由于小程序的API的參數格式都比較統一,只接受一個object參數,回調都是在這個參數中設置,所以,這為我們的統一處理提供了便利,我們可以寫一個非侵入性的工具方法,來完成這樣的工作:

假設我們將這個工具方法寫到一個名為的util.js的文件中:

var Promise = require('../libs/bluebird.min')  //我用了bluebird.jsfunction wxPromisify(fn) {  return function (obj = {}) {    return new Promise((resolve, reject) => {      obj.success = function (res) {        resolve(res)      }      obj.fail = function (res) {        reject(res)      }      fn(obj)    })  }}module.exports = {  wxPromisify: wxPromisify}

之后,我們來看一下如何使用這個方法,將原來回調方式的API變成Promise的方式:

var util = require('../utils/util')var getLocationPromisified = util.wxPromisify(wx.getLocation)getLocationPromisified({ type: 'wgs84'}).then(function (res) { var latitude = res.latitude  var longitude = res.longitude  var speed = res.speed  var accuracy = res.accuracy }).catch(function () { console.error("get location failed")})

是不是很容易理解?

 以上就是關于使用Promise處理異步流程,如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美国产日韩一区二区三区| 欧美在线性爱视频| 亚洲成色777777女色窝| 亚洲最大的成人网| 成人欧美一区二区三区在线| 92国产精品视频| 97久久精品人搡人人玩| 国产精品嫩草视频| 欧美成人精品不卡视频在线观看| 亚洲第一页中文字幕| 麻豆一区二区在线观看| 欧美自拍大量在线观看| 日韩欧美国产高清91| 国产精品美女免费视频| 欧美一区深夜视频| 国产精品2018| 日韩欧美中文免费| 欧美猛交ⅹxxx乱大交视频| 亚洲高清色综合| 亚洲v日韩v综合v精品v| 亚洲白拍色综合图区| 亚洲精品久久久久久下一站| 国产精品夜间视频香蕉| 欧美在线激情视频| 国产视频久久久久久久| 欧美限制级电影在线观看| 日av在线播放中文不卡| 日韩成人在线免费观看| 欧美视频在线观看免费网址| 欧美亚洲视频在线观看| 理论片在线不卡免费观看| 欧美精品一本久久男人的天堂| 国产精品免费看久久久香蕉| 久久精品这里热有精品| 久久99国产精品久久久久久久久| 亚洲美女在线视频| 国产精品老女人精品视频| 国产美女精品免费电影| 成人黄色av免费在线观看| 青草青草久热精品视频在线网站| 亚洲free性xxxx护士白浆| 1769国内精品视频在线播放| 91sao在线观看国产| 国产精品爱啪在线线免费观看| 国产精品美女主播| 精品香蕉一区二区三区| 色婷婷综合久久久久中文字幕1| 亚洲欧美精品中文字幕在线| 亚洲一区二区久久久| 91亚洲va在线va天堂va国| 亚洲社区在线观看| 国产亚洲欧美一区| 亚洲性线免费观看视频成熟| 久久精品国产亚洲一区二区| 欧美性xxxxxxxxx| 欧美日韩国产第一页| 国内精品400部情侣激情| 国产成+人+综合+亚洲欧美丁香花| 国产精品v片在线观看不卡| 精品久久久91| 精品日韩视频在线观看| 成人在线免费观看视视频| 亚洲国模精品私拍| 91视频8mav| 亚洲国产91色在线| 日韩av最新在线观看| 日韩电影视频免费| 亚洲国产精品国自产拍av秋霞| 国产精品视频男人的天堂| 国产精品美女在线| 亚洲一二三在线| 国产成人啪精品视频免费网| 色先锋资源久久综合5566| 91精品在线播放| 国产精品福利在线观看网址| 免费99精品国产自在在线| 91日本视频在线| 久久91精品国产| 亚洲欧美日韩精品久久| 国产精品久久视频| 欧美激情a∨在线视频播放| 国产精品日韩欧美综合| 国产欧美精品日韩| 亚洲成人激情小说| 亚洲国产精品va| 岛国视频午夜一区免费在线观看| 一区二区三区回区在观看免费视频| 亚洲日韩中文字幕在线播放| 国产一区二区动漫| 欧美专区中文字幕| 亚洲精品免费一区二区三区| 中文字幕日韩欧美在线视频| 日本精品免费观看| 久久成人亚洲精品| 亚洲激情视频在线观看| 亚洲午夜色婷婷在线| 日韩在线精品一区| 92福利视频午夜1000合集在线观看| 久久久精品一区| 亚洲美女免费精品视频在线观看| 国产精品久久久久免费a∨大胸| 欧美激情视频免费观看| 国产成人免费av电影| 亚洲女在线观看| 久久人人爽人人爽人人片av高请| 国产99久久久欧美黑人| 亚洲少妇激情视频| 成人国产精品av| 欧美午夜片欧美片在线观看| 久久成人综合视频| 精品久久久久久亚洲国产300| 日本在线精品视频| 国产精品一二三在线| 久久人人爽人人爽人人片av高清| 国模视频一区二区| 日本亚洲欧美成人| 亚洲国产精品成人一区二区| 91成人免费观看网站| 草民午夜欧美限制a级福利片| 国产精品久久久久av| 国产成人精彩在线视频九色| 国产香蕉一区二区三区在线视频| 怡红院精品视频| 91精品国产色综合久久不卡98| 国产日产欧美精品| 亚洲最大av在线| 欧美激情精品久久久久久黑人| 欧美福利在线观看| 国产精品久久999| 粉嫩老牛aⅴ一区二区三区| 伊人青青综合网站| 91精品国产91久久久久久不卡| 亚洲bt欧美bt日本bt| 疯狂蹂躏欧美一区二区精品| 九九视频这里只有精品| 日韩成人在线视频网站| 日韩av三级在线观看| 国产精品电影久久久久电影网| 98精品国产自产在线观看| 91精品国产综合久久男男| 日韩免费黄色av| 午夜伦理精品一区| 日韩在线视频网| 国产丝袜一区二区| 久久资源免费视频| 亚洲影影院av| 日韩欧美中文免费| 国产日韩精品视频| 91最新在线免费观看| 国产成人aa精品一区在线播放| 国外成人性视频| 国产精品亚洲第一区| 久久国产精彩视频| 国产剧情日韩欧美| www.日本久久久久com.| 日韩一区视频在线| 日韩小视频在线| 国产成人精品优优av| 日韩av在线免费播放| 亚洲最大成人网色| 亚洲精品免费av| 26uuu另类亚洲欧美日本一| www.欧美三级电影.com| 国产精品电影久久久久电影网|