全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

微信小程序中使用Promise进行异步流程处理的实例详解

微信小程序中使用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进行异步流程处理  # 小程序  # Promise  # 异步处理  # 微信小程序中使用Async-await方法异步请求变为同步请求方法  # 详解将微信小程序接口Promise化并使用async函数  # 微信小程序 缓存(本地缓存、异步缓存、同步缓存)详解  # 详解微信小程序 同步异步解决办法  # 微信小程序异步处理详解  # 微信小程序 wx.request方法的异步封装实例详解  # 微信小程序onLaunch异步  # 首页onLoad先执行?  # 微信小程序中使用ECharts 异步加载数据的方法  # 微信小程序之支付后调用SDK的异步通知及验证处理订单方法  # 微信小程序 es6-promise.js封装请求与处理异步进程  # 微信小程序利用co处理异步流程的方法教程  # 微信小程序中使用 async/await的方法实例分析  # 回调  # 都是  # 就会  # 在这里  # 很好  # 太多  # 就像  # 在这个  # 是有  # 有很多  # 就不  # 如有  # 这个问题  # 很容易  # 我们可以  # 用了  # 这一切  # 希望能  # 能让  # 又要 


相关文章: 如何用搬瓦工VPS快速搭建个人网站?  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  模具网站制作流程,如何找模具客户?  如何快速查询网站的真实建站时间?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  建站主机CVM配置优化、SEO策略与性能提升指南  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  Swift中循环语句中的转移语句 break 和 continue  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  Python路径拼接规范_跨平台处理说明【指导】  建站之星安装步骤有哪些常见问题?  制作电商网页,电商供应链怎么做?  Android使用GridView实现日历的简单功能  h5在线制作网站电脑版下载,h5网页制作软件?  如何正确选择百度移动适配建站域名?  如何通过FTP空间快速搭建安全高效网站?  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  教学论文网站制作软件有哪些,写论文用什么软件 ?  重庆市网站制作公司,重庆招聘网站哪个好?  如何在搬瓦工VPS快速搭建网站?  黑客如何通过漏洞一步步攻陷网站服务器?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  韩国服务器如何优化跨境访问实现高效连接?  如何在香港免费服务器上快速搭建网站?  已有域名和空间如何搭建网站?  移民网站制作流程,怎么看加拿大移民官网?  如何在VPS电脑上快速搭建网站?  子杰智能建站系统|零代码开发与AI生成SEO优化指南  微信小程序 input输入框控件详解及实例(多种示例)  如何选择美橙互联多站合一建站方案?  大同网页,大同瑞慈医院官网?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  ,南京靠谱的征婚网站?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  打鱼网站制作软件,波克捕鱼官方号怎么注册?  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  h5网站制作工具有哪些,h5页面制作工具有哪些?  如何高效利用亚马逊云主机搭建企业网站?  小程序网站制作需要准备什么资料,如何制作小程序?  昆明网站制作哪家好,昆明公租房申请网上登录入口?  为什么Go需要go mod文件_Go go mod文件作用说明  重庆网站制作公司哪家好,重庆中考招生办官方网站?  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  微信h5制作网站有哪些,免费微信H5页面制作工具?  图册素材网站设计制作软件,图册的导出方式有几种?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  如何在西部数码注册域名并快速搭建网站?  c# 服务器GC和工作站GC的区别和设置  成都响应式网站开发,dw怎么把手机适应页面变成网页? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。