第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在Promise外部控制其狀態(tài)

如何在Promise外部控制其狀態(tài)

慕工程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 事件,它是一個異步調用(用戶什么時候點擊并不知道)。一般操作是為這個單擊事件寫回調,單擊時觸發(fā)。如果你想用 Promise,就需要在 Promise 里設置單擊事件,并在這個事件觸發(fā)之后,調用 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 關注
  • 462 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號