前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何封装一个可以终止的Promise

如何封装一个可以终止的Promise

作者头像
挥刀北上
发布2020-07-10 11:33:40
1.5K0
发布2020-07-10 11:33:40
举报
文章被收录于专栏:Node.js开发

今天被同事问到如何中止Promise调用链,按照官方文档的意思,原生的Promise是不能被中止的,但是我们可以对其进行小小的改造,封装一个可以被"中止"的Promsie。代码如下:

代码语言:javascript
复制
function MyPromise(callback) {
// 1、在Pormise外部定义变量
    let _resolve;
    let _reject;
    const promise = new Promise((resolve, reject) => {
// 2、在Pormise内部将promise的resolev和reject方法赋值给外部变量
        _resolve = resolve;
        _reject = reject;
        callback && callback(resolve);
    })

    return {
        promise,
        _reject
    }
}

let p1 = MyPromise(function (reslove) {
    setTimeout(() => {
        reslove(1000)
    }, 3000);
})
let p2 = MyPromise(function (reslove) {
    setTimeout(() => {
        reslove(2000)
    }, 3000);
})
let p3 = MyPromise(function (reslove) {
    setTimeout(() => {
        reslove(3000)
    }, 3000);
})

p1.promise.then(data => {
    console.log(data)
    return p2.promise;
}).then(data => {
    console.log(data)
    return p3.promise;
}).then(data => {
    console.log(data)
}).catch(e => console.log(e))

// 此处p3可以更改为p1或p2,根据需求终止promise调用链
p3._reject(444)

阅读代码,我们利用闭包将每个Promise的reject保存起来,在需要中止的时候,去调用对应Promise的reject即可"中止"Promise的后续执行,巧妙的实现了终止Promise的then链执行。

总结一下:我们在使用Promise的时候,通常以为Promise的resolve和reject只能在Promise内部执行,但是我们可以通过定义一个外部变量,然后在执行new Promise的时候将reject或者resove赋值给外部变量,这样我们就通过外部变量获取到了Promise的控制权。从而随时“中止”Promise链的执行。

如果你有其他方法或者建议欢迎留言。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 nodejs全栈开发 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档