最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年08月17日 11:17:50   作者:一斤代碼  
這篇文章主要介紹了微信小程序中使用Promise進(jìn)行異步流程處理的實例詳解的相關(guān)資料,這里詳細(xì)說明該如何使用Promise 來進(jìn)行異步流程的處理,提供具體實現(xiàn)步驟,需要的朋友可以參考下

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

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

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

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

function asyncFunc(callback) {
 setTimeout(function () {
  //在這里寫你的邏輯代碼
  //...

  //邏輯代碼結(jié)束,執(zhí)行一個回調(diào)函數(shù)
  callback();
 }, 5000);
}

或者:

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

然后我們這樣調(diào)用:

asyncFunc(function () {
 console.log("asyncFunc() run complete");
});

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

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

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

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

這樣的代碼可讀性和可維護(hù)性可想而知了。還有,回調(diào)函數(shù)真正的問題在于:

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

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

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

function asyncFunc1(){
 return new Promise(function (resolve, reject) {
  //...
 })
}

 
// asyncFunc2,3,4,5也實現(xiàn)成跟asyncFunc1一樣的方式...

然后看一下他們是怎么樣被調(diào)用的:

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

這樣,這些異步函數(shù)就會按照順序一個一個依次執(zhí)行了。

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

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

如:

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呢?答案是肯定的,我們當(dāng)然可以一個一個的用Promise去包裝這些API,但是這個還是比較麻煩的。不過,由于小程序的API的參數(shù)格式都比較統(tǒng)一,只接受一個object參數(shù),回調(diào)都是在這個參數(shù)中設(shè)置,所以,這為我們的統(tǒng)一處理提供了便利,我們可以寫一個非侵入性的工具方法,來完成這樣的工作:

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


var Promise = require('../libs/bluebird.min')  //我用了bluebird.js
function 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
}

之后,我們來看一下如何使用這個方法,將原來回調(diào)方式的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")
})

是不是很容易理解?

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

相關(guān)文章

  • 使用JavaScript練習(xí)動畫最好的方式封面過渡

    使用JavaScript練習(xí)動畫最好的方式封面過渡

    這篇文章主要為大家介紹了使用JavaScript練習(xí)動畫最好的方式封面過渡實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 一文詳解Electron?快捷鍵使用技巧及示例

    一文詳解Electron?快捷鍵使用技巧及示例

    這篇文章主要為大家介紹了Electron?中的快捷鍵使用技巧及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • js中閉包結(jié)合遞歸等于柯里化原理解析

    js中閉包結(jié)合遞歸等于柯里化原理解析

    這篇文章主要為大家介紹了閉包結(jié)合遞歸等于柯里化的原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 微信小程序page的生命周期和音頻播放及監(jiān)聽實例詳解

    微信小程序page的生命周期和音頻播放及監(jiān)聽實例詳解

    這篇文章主要介紹了微信小程序page的生命周期和音頻播放及監(jiān)聽實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • nuxt.js 多環(huán)境變量配置

    nuxt.js 多環(huán)境變量配置

    這篇文章主要介紹了nuxt.js 多環(huán)境變量配置,一般在香米開發(fā)中會有三個環(huán)境開發(fā)環(huán)境也叫測試環(huán)境(test) 、RC環(huán)境也叫預(yù)發(fā)布環(huán)境(rc) 、線上環(huán)境(production) 下面來看看文章內(nèi)容的詳細(xì)介紹,需要的朋友可以參考一下
    2021-11-11
  • 微信小程序 檢查接口狀態(tài)實例詳解

    微信小程序 檢查接口狀態(tài)實例詳解

    這篇文章主要介紹了微信小程序 檢查接口狀態(tài)實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • JS實現(xiàn)一個文件選擇組件詳解

    JS實現(xiàn)一個文件選擇組件詳解

    這篇文章主要為大家介紹了JS實現(xiàn)一個文件選擇組件詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • JavaScript獲取上傳文件相關(guān)信息示例詳解

    JavaScript獲取上傳文件相關(guān)信息示例詳解

    這篇文章主要為大家介紹了JavaScript獲取上傳文件相關(guān)信息示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • JS前端使用canvas搞一個手勢識別

    JS前端使用canvas搞一個手勢識別

    這篇文章主要為大家介紹了JS前端使用canvas搞一個手勢識別的實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 前端的狀態(tài)管理(上)

    前端的狀態(tài)管理(上)

    這篇文章主要講解前端的狀態(tài)管理,狀態(tài)管理李娜就想到:Vuex、Redux、Flux、Mobx等等方案,不論哪種方案只要內(nèi)容一多起來似乎都是令人頭疼的問題,今天來聊一聊前端的狀態(tài)管理,感興趣的小伙伴可以參考參考下面文字具體內(nèi)容
    2021-10-10

最新評論

慈溪市| 东山县| 邳州市| 京山县| 达尔| 洛南县| 册亨县| 大埔县| 永德县| 庆阳市| 彩票| 和政县| 海宁市| 昭平县| 隆德县| 林口县| 泰州市| 临夏市| 安多县| 正镶白旗| 天峨县| 天峻县| 宝鸡市| 镇安县| 清镇市| 焦作市| 信宜市| 上栗县| 濮阳市| 博客| 灵武市| 韶山市| 延吉市| 溧水县| 日喀则市| 大埔县| 高青县| 潞城市| 博罗县| 巩留县| 汶上县|