为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Promise外部控制其状态

如何在Promise外部控制其状态

慕工程0101907 2018-12-12 18:14:21
请问如何避免报错呢?我应该思路就是错的, 求解决思路var obj = {    ok: null,    cancel: null};function fn() {    return new Promise((resolve, reject) => {        obj.ok = resolve;        obj.cancel = reject;    });}fn();obj.cancel(); //  Uncaught (in promise) undefined
查看完整描述

1 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

先直接说代码的问题,在于 Promise 没有 catch,可以


fn()

    .then(() => {

        // ... resolve 之后的事情

        // 可以省略不要

    })

    .catch(() => {

        // ... reject 之后的事情

    });

或者直接在 then 的时候指定第二个回调


fn()

    .then(() => {

        // ... resolve 之后的事情

        // 可以省略不要

    }, () => {

        // ... reject 之后的事情

    });

然后来说说这个设计思路的问题


Promise 是一次性的,也就是说,如果你调用了 resolve 或者 reject 这个 Promise 会处理相关回调,然后它的生命周期就结束了。那么在这种情况下,你把 resolve 和 reject 赋给 obj 作为属性使用,就不符合“一次性”,因为可以通过 obj 多次调用。所以这个设计思路本身是有问题的


然后,从你的代码我看不出来你是想干啥。Promise 用于处理异步调用,那一定是存在异步调用才需要处理,所以要从异步调用的点开始去思考。


比如,有一个 click 事件,它是一个异步调用(用户什么时候点击并不知道)。一般操作是为这个单击事件写回调,单击时触发。如果你想用 Promise,就需要在 Promise 里设置单击事件,并在这个事件触发之后,调用 Promise 的 resolve 或 reject,同时,由于 Promise 是一次性的,所以还得注销这个事件,过程是这样


const waitClick = new Promise((resolve, reject) => {

    function handler(e) {

        $("#something").off("click", handler);

        if (somethingRight) {

            resolve(e);

        } else {

            reject(e);

        }

    }


    $("#something").on("click", handler);

});


waitClick

    .then(e => {


    })

    .catch(e => {


    });

当然这里单击事件只是为了表示异步,实际上事件处理直接用回调更方便。所以用 Promise,一定要找到你异步的起点在哪里,不然 Promise 没啥意义。

最后,如果有空可以了解下 async/await,Node 7.6 之后就完全支持了,用它以同步形式的代码写异步会方便得多。

查看完整回答
反对 回复 2019-01-25
  • 1 回答
  • 0 关注
  • 441 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信