微信promise和async await
在微信小程序项目中,接触到了promsie,参考其他文章,深入学习了promsie的原理及用法。学习异步编程。
在JavaScript的世界中,所有代码都是单线程执行的。
由于这个“缺陷”,导致JavaScript的所有网络操作,浏览器事件,都必须是异步执行。
异步执行可以用回调函数实现:
1 | function callback() { |
观察上述代码执行,在Chrome的控制台输出可以看到:
1 | before setTimeout() |
可见,异步操作会在将来的某个时间点触发一个函数调用。
AJAX就是典型的异步操作。以上一节的代码为例:
1 | request.onreadystatechange = function () { |
把回调函数success(request.responseText)
和fail(request.status)
写到一个AJAX操作里很正常,但是不好看,而且不利于代码复用。
有没有更好的写法?比如写成这样:
1 | var ajax = ajaxGet('http://...'); |
这种链式写法的好处在于,先统一执行AJAX逻辑,不关心如何处理结果,然后,根据结果是成功还是失败,在将来的某个时候调用success
函数或fail
函数。
古人云:“君子一诺千金”,这种“承诺将来会执行”的对象在JavaScript中称为Promise对象。
Promise有各种开源实现,在ES6中被统一规范,由浏览器直接支持。
我们先看一个最简单的Promise例子:生成一个0-2之间的随机数,如果小于1,则等待一段时间后返回成功,否则返回失败:
1 | function test(resolve, reject) { |
这个test()
函数有两个参数,这两个参数都是函数,如果执行成功,我们将调用resolve('200 OK')
,如果执行失败,我们将调用reject('timeout in ' + timeOut + ' seconds.')
。可以看出,test()
函数只关心自身的逻辑,并不关心具体的resolve
和reject
将如何处理结果。
有了执行函数,我们就可以用一个Promise对象来执行它,并在将来某个时刻获得成功或失败的结果:
1 | var p1 = new Promise(test); |
变量p1
是一个Promise对象,它负责执行test
函数。由于test
函数在内部是异步执行的,当test
函数执行成功时,我们告诉Promise对象:
1 | // 如果成功,执行这个函数: |
当test
函数执行失败时,我们告诉Promise对象:
1 | p2.catch(function (reason) { |
Promise对象可以串联起来,所以上述代码可以简化为:
1 | new Promise(test).then(function (result) { |
async await
async/await 可以同样逻辑的代码看起来舒服得多
1 | (async () => { |
微信小程序中Api请求
1 | function openApi(deviceId, unionId) { |
参考资料
https://www.liaoxuefeng.com/wiki/1022910821149312/1023024413276544
https://www.sunzhongwei.com/wechat-small-program-support-await-use-of-keyword
https://developers.weixin.qq.com/miniprogram/dev/framework/app-service/api.html#API
https://segmentfault.com/a/1190000021966277