移动开发 \ 微信小程序 \ Promise - js异步控制神器

Promise - js异步控制神器

总点击163
简介:如果对您有帮助,请关注我,欢迎加入微信小程序开发交流QQ群(173683866),有问题可以加群问我或者问群里的大神!!!

如果对您有帮助,请关注我,欢迎加入微信小程序开发交流QQ群(173683866),有问题可以加群问我或者问群里的大神!!!

首先给来一个简单的demo看看Promise是怎么使用的:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<script type="text/javascript">

var myPromise;

function my_load() {

return myPromise = new Promise(function(resolve,reject) {

//当异步代码执行成功时,我们才会调用resolve(...),当异步代码失败时就会调用reject(...)

//在本例中,我们使用setTimeout(...)来模拟异步代码,实际编码时可能是XHR请求或是HTML5的一些API方法.

setTimeout(function() {

resolve("myPromise的resolve执行完毕!"); //代码正常执行!

},5000);

});

}

</script>

</head>

<body onload="my_load()">

<div、 color: red; height: 100px;width: 100px;" onclick="test_1(this)">

测试

</div>

<script>

function test_1(e) {

//当myPromise的resolve执行完毕以后下面才会执行

myPromise.then(function(resolve_finish) {

//resolve_finish随便命名,的值是上面调用resolve()方法传入的值.

alert(resolve_finish);

});

}

</script>

</body>

</html>


下面提供两个示例,都是我在实际项目中使用的代码,如果有不足或理解不对还请批评指正.另外欢迎大家加入微信小程序开发交流群(173683895)


解决方案: 使用Promise对象,它是用来传递异步操作的消息的.它有三种状态,Pending(进行中) Resolved(已完成)  Rejected(已失败). 这三种状态是由异步操作的结果来决定的.并且执行完成后无法更改,

实战示例一,

需求:我们有两个函数异步执行的情况下,

1.第一个函数是获取用户的openid(唯一标识),

2第二个函数是根据第一个函数获取到的openid的值做下一步操作,

在异步执行的情况下,由于网络请求是需要时间的,所以需要使用Promise对象来保证第一个函数的网络请求执行完了再执行第二个函数;

第一个函数: 重点是

return that.promise = new Promise((resolve) => {resolve(data.openid)}


函数解析:执行onLaunch函数返回一个promise对象,promise对象的resolve状态里面输入一个data.openid参数,

App({

onLaunch: function () {

var that = this;

that.appid = '';

that.secret = '';

that.program_id = '';

// that.openid = 'cvzc'

return that.promise = new Promise((resolve) => {

wx.login({

success: function (res) {

that._code = res.code;

wx.request({

//获取openid接口

url: 'info',

data: {

code: res.code,

appid: that.appid,

secret: that.secret

},

method: 'post',

header: {

'content-type': 'application/x-www-form-urlencoded'

},

success: function (res) {

var data = JSON.parse(res.data)

that.openid = data.openid

resolve(data.openid)

}

})

}

})

})

}

})


第二个函数:需求:循环的后续操作必须等所有异步请求都返回了才继续下一步操作

app.promise.then(function (openid) {


函数解析: 这里调用了app.js里面的promise对象,参数就是第一个函数网络请求得到的用户唯一标识(openid),{ //这里面是得到唯一标识以后执行的代码 }


// pages/login/lunh.js

const app = getApp();

const util = require("../../utils/util.js")

Page({

data: {

},

onLoad: function (options) {

var that = this;

app.promise.then(function (openid) {

var data = {

program_id: app.program_id,

openid: openid

}

util.request('demo.php','get',data,'正在加载数据',function (res) {

wx.setStorageSync('btn',res.data.as_id)

if (res.data.state == 1) {

wx.switchTab({

url: '../index/index',

})

} else {

wx.navigateTo({

url: 'login',

})

}

})

// success

},function (openid) {

// failure

});

},

/**

* 用户点击右上角分享

*/

onShareAppMessage: function () {

}

})


实战示例二,

获取用户手机本地的地址并计算出本地地址到指定地址的距离,单位米:

// index.js


const app = getApp()

const util = require("../../utils/util.js")

const qqmap = require("../../utils/qqmap-wx-jssdk.js")

var qqmapsdk;

data_list: function () {

const that = this

const syncArr = []

const url = util.apiUrl + 'Index/index_show?program_id=' + app.program_id

util.request(url,'post','',function (res) {

for (let i = 0; i < res.data.k4.length; i++) {

syncArr.push(util.map(res.data.k4[i].sh_jd))

}

Promise.all(syncArr).then(results => {

for (let j = 0; j < results.length; j++) {

res.data.k4[j].sh_jd = results[j]

}

that.setData({

arr: res.data,

lunbo: res.data.k1,

images: res.data.k2,

nearby_merchant: res.data.k4

})

})

})

},


// 加载数据列表

const app = getApp()

const util = require("../../utils/util.js")

const qqmap = require("../../utils/qqmap-wx-jssdk.js")

var qqmapsdk;

data_list: function () {

const that = this

const syncArr = []

const url = 'demo.php?program_id=' + app.program_id

util.request(url,function (res) {

for (let i =0; i < res.data.k4.length; i++) {

syncArr.push(util.map(res.data.k4[i].sh_jd))

}

Promise.all(syncArr).then(results => {

for (let j =0; j < results.length; j++) {

res.data.k4[j].sh_jd = results[j]

}

that.setData({

arr: res.data,


// util.js

var qqmapsdk = new qqmap({

key: 'WFLBZ-ABRHX-A474W-75TT3-L2NZF-VAF5Q'

});

return new Promise((resolve) => {

const latitude = data.split(',')

qqmapsdk.calculateDistance({

to: [{

latitude: latitude[0],

longitude: latitude[1]

}],

success(res) {

const distance = Math.floor(res.result.elements[0].distance / 1000 * 100) / 100

resolve(distance)

},

fail() {

resolve('')

}

})

})

}

module.exports = {

map: map,

}


意见反馈 常见问题 官方微信 返回顶部