微信小程序中怎么使用Promise進行異步操作-創新互聯

這篇文章主要介紹“微信小程序中怎么使用Promise進行異步操作”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“微信小程序中怎么使用Promise進行異步操作”文章能幫助大家解決問題。

創新互聯是一家專業提供金東企業網站建設,專注與成都網站設計、成都做網站、H5響應式網站、小程序制作等業務。10年已為金東眾多企業、政府機構等服務。創新互聯專業網站設計公司優惠進行中。

微信小程序中使用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.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
}

之后,我們來看一下如何使用這個方法,將原來回調方式的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進行異步操作”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注創新互聯行業資訊頻道,小編每天都會為大家更新不同的知識點。

當前標題:微信小程序中怎么使用Promise進行異步操作-創新互聯
URL地址:http://m.kartarina.com/article18/ccipdp.html

成都網站建設公司_創新互聯,為您提供品牌網站設計做網站ChatGPT定制開發網站收錄網站導航

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

外貿網站建設
主站蜘蛛池模板: 人妻少妇乱子伦无码专区| 日产无码1区2区在线观看| 亚洲精品人成无码中文毛片| 国产精品无码AV不卡| 国产亚洲3p无码一区二区| 制服在线无码专区| 国产亚洲精品无码拍拍拍色欲| 麻豆aⅴ精品无码一区二区| 日韩毛片免费无码无毒视频观看| 中文无码人妻有码人妻中文字幕| 亚洲中文字幕无码爆乳app| 中文无码成人免费视频在线观看| 亚洲AV无码一区二区一二区| 亚洲国产精品无码av| 国产成人无码免费看片软件| 亚洲av永久无码天堂网| 亚洲成AV人片天堂网无码| 亚洲国产av无码精品| (无码视频)在线观看 | 精品无码人妻一区二区三区 | 亚洲精品无码高潮喷水在线| 久久久久亚洲精品无码网址色欲| 午夜无码伦费影视在线观看| 国产成人精品无码一区二区三区 | 亚洲成A∨人片在线观看无码| 人妻无码一区二区三区四区| 无码丰满熟妇一区二区 | 亚洲GV天堂GV无码男同| 免费A级毛片无码无遮挡内射| 亚洲国产精品无码久久一线| 国产精品ⅴ无码大片在线看| 日韩人妻无码精品专区| 狠狠躁狠狠躁东京热无码专区| 无码日韩人妻精品久久| 性饥渴少妇AV无码毛片| 久久AV无码精品人妻出轨| 久久久久无码精品国产h动漫| 无码高潮少妇毛多水多水免费| 国产免费av片在线无码免费看| 国产精品无码制服丝袜| 内射人妻无套中出无码|