Promise 封装 wx 原生方法
解释下何为Promise
在的世界中,所有代码都是单线程执行的。
由于这个“缺陷”,导致的所有网络操作,浏览器事件,都必须是异步执行。
function callback() {
console.log('Done');
}
console.log('before setTimeout()');
setTimeout(callback, 1000); // 1秒钟后调用callback函数console.log('after setTimeout()');
观察代码执行情况 ,可以在Chrome的控制台输出发现:
Promise还可以做更多的事情,比如,有若干个异步任务,需要先做任务1,如果成功后再做任务2,任何任务失败则不再继续并执行错误处理函数。
要串行执行这样的异步任务,不用Promise需要写一层一层的嵌套代码。有了Promise,我们只需要简单地写:
job1.then(job2).then(job3).catch(handleError);
有些时候,多个异步任务是为了容错。比如,同时向两个URL读取用户的个人信息,只需要获得先返回的结果即可。这种情况下,用Promise.race()
实现:
var p1 = new Promise(function (resolve, reject) {
setTimeout(resolve, 500, 'P1');
});var p2 = new Promise(function (resolve, reject) {
setTimeout(resolve, 600, 'P2');
});
Promise.race([p1, p2]).then(function (result) {
console.log(result); // 'P1'});
由于p1
执行较快,Promise的then()
将获得结果'P1'
。p2
仍在继续执行,但执行结果将被丢弃。
如果我们组合使用Promise,就可以把很多异步任务以并行和串行的方式组合起来执行。
样例一 :
// 显示”载入中”,在一秒后消失wx.showLoading({
title: "载入中",
success: function () {
setTimeout(function () {
wx.hideLoading()
}, 1000)
},
fail: function(){},
complete: function(){}
});
原生的 success,fail 和 complete 已能够满足基本的异步回调了,但是如果遇到多个连续的阻塞任务,会造成多层嵌套(如样例二所示),就很奔溃。
样例二 :
// 显示“保存中”,一秒后隐藏,半秒后显示“载入中”,一秒后隐藏wx.showLoading({
title: "保存中",
success: function () {
setTimeout(function () {
wx.hideLoading({
success: function () {
setTimeout(function () {
wx.showLoading({
title: "载入中",
success: function () {
setTimeout(function () {
wx.hideLoading()
},1000)
}
})
}, 500)
}
})
}, 1000)
}
})
https://github.com/CFETeam/weapp-demo-websocket