千家信息网

微信小程序中怎么使用Promise进行异步操作

发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,这篇文章主要介绍"微信小程序中怎么使用Promise进行异步操作"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"微信小程序中怎么使用Promise进行异步操作"
千家信息网最后更新 2025年02月05日微信小程序中怎么使用Promise进行异步操作

这篇文章主要介绍"微信小程序中怎么使用Promise进行异步操作"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"微信小程序中怎么使用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.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进行异步操作"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

代码 程序 函数 方式 问题 处理 参数 方法 支持 流程 知识 工具 标准 界面 答案 行业 还是 进程 逻辑 页面 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 现今的网络安全 服务器版本更新 天津久大网络技术有限公司 系统的后台数据库 守防网络安全构建和谐校园手抄报 学校网络文明网络安全教育主题 虚拟服务器是可以当普通电脑用么 嘉定区网络软件开发厂家批发价 玩游戏服务器延迟是什么情况 qq使用什么软件开发的 基因启动子数据库epd 河北保定网络安全监察大队 上海网络安全专家服务 无锡服务器托管 中国网络安全战争 搜狗引擎是否租用百度数据库 长宁区网络技术转让价格合理 数据库资源耗尽 佛山地产软件开发常见问题 金碟取其他报表数据库 服务器机箱塔式家用 笔记本电脑关闭服务器 顺义区综合网络技术推广品质保障 重庆联通服务器类型虚拟主机 数据库自动增长百分比 苹果手机使用什么数据库 福建省网络安全机构 滁州通信软件开发费用 与网络技术相关单位工作 工行软件开发中心推荐
0