前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >到不了的承诺,内附demo(promise/async/await)

到不了的承诺,内附demo(promise/async/await)

作者头像
用户2845596
发布2021-01-21 15:09:21
4550
发布2021-01-21 15:09:21
举报
文章被收录于专栏:劝学

看多了写的promise/async正面使用的文章,下面介绍几种Promise特性带来的几个有趣的例子。 有点像物理实验里的永动机。。

promise之永远也到不了的地方

无穷无尽的promise

下面这个例子,是因为resolve回调函数的参数是promise实例(下文简称N),状态就转移到了N上,直到N状态改变,timeoutresolve回调函数才执行回调

这里也看出了promise使用的一个弊端,就是执行后,无法取消。

此处是Demo

代码语言:javascript
复制
let i = 1
function timeout() {
    let ms = Math.random() * 10 * 1000
    return new Promise(resolve => {
        setTimeout(function () {
            console.log(`${i++} revoke of ${ms}`)
            resolve(timeout())
        }, ms)
    })
}

timeout().then(ms => {
    console.log('来到这里是不可以的,这辈子都不可能的')
})
复制代码
让她回来吧
代码语言:javascript
复制
// Sorry, promise执行后,就无法取消了

没有resolved的promise

下面直接一个promise,并reject,发现async函数的then是不会执行的

代码语言:javascript
复制
async function waitless () {
    return await Promise.reject(new Error('err'))
}

waitless().then(res => {
    console.log('来到这里是不可以的,这辈子都不可能的')
})
复制代码
让她回来吧,自身捕获

promise自身捕获,从而不影响await的后续执行

代码语言:javascript
复制
async function hava_a_catch() {
    return await Promise.reject(new Error('err')).catch(e => e)
}
have_a_catch().then(res => {
    console.log(res) // => undefined
})
复制代码
调用方使用catch捕获
代码语言:javascript
复制
async function waitless() {
    return await Promise.reject(new Error('err'))
}
waitless().then(res => {
    console.log('我在这里孤怜怜的等着,直到世界尽头...')
}).catch(e => {
    console.log('恩,我在这里输出了')
})
复制代码

The end

以上都是看阮老师《ES6入门》,然后总结出来的。 然后果然是promise的使用上是不难的,就是错误获取有点绕。 特别是promise.then返回的是一个新的promise,promise.catch返回的也是新的promise。catch之后,这个新的promise的状态就是干净的了 promise还可以链式调用,最后一个catch可以捕获前面所有的错误。 再加上promise可以吃掉内部的报错,不影响JS的执行。 还有Promise.all的调用,好几个promise执行,其中一个reject了怎么办,在哪个地方捕获,最好的方案是子promise自身捕获,还是all回调捕获呢?其实这个是要根据场景来的。

总之,阮老师的教程里都有讲到,大家细心、耐心的看下去就肯定可以了解到promise设计的是有多周到了


参考:

async函数:async

promise函数:promise

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • promise之永远也到不了的地方
    • 无穷无尽的promise
      • 让她回来吧
    • 没有resolved的promise
      • 让她回来吧,自身捕获
      • 调用方使用catch捕获
    • The end
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档