亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

什么是明確的承諾構建反模式,我該如何避免它?

什么是明確的承諾構建反模式,我該如何避免它?

慕森王 2019-05-20 16:02:20
我編寫的代碼看起來像:function getStuffDone(param) {           | function getStuffDone(param) {    var d = Q.defer(); /* or $q.defer */ |     return new Promise(function(resolve, reject) {    // or = new $.Deferred() etc.        |     // using a promise constructor    myPromiseFn(param+1)                 |         myPromiseFn(param+1)    .then(function(val) { /* or .done */ |         .then(function(val) {        d.resolve(val);                  |             resolve(val);    }).catch(function(err) { /* .fail */ |         }).catch(function(err) {        d.reject(err);                   |             reject(err);    });                                  |         });    return d.promise; /* or promise() */ |     });}                                        | }有人告訴我這個被稱為“ 延遲反模式 ”或“ Promise構造函數反模式 ”,這個代碼有什么不好,為什么這被稱為反模式?
查看完整描述

2 回答

?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

Esailija創造的延遲反模式(現在是明確構建的反模式)是一種常見的反模式人物,他們是新的承諾,我在我第一次使用承諾時自己創造了。上述代碼的問題在于無法利用promises鏈的事實。

承諾可以鏈接,.then你可以直接返回承諾。您的代碼getStuffDone可以重寫為:

function getStuffDone(param){
    return myPromiseFn(param+1); // much nicer, right?}

Promise都是為了使異步代碼更具可讀性,并且表現得像同步代碼而不隱藏這一事實。Promise表示對一次操作的值的抽象,它們在編程語言中抽象出語句或表達式的概念。

將API轉換為promises并且無法自動執行時,或者當您編寫更容易表達的聚合函數時,您應該只使用延遲對象。

引用Esailija:

這是最常見的反模式。當你不真正理解承諾并將它們視為美化事件發射器或回調實用程序時,很容易陷入這種情況。讓我們回顧一下:promises是關于使異步代碼保留同步代碼的大部分丟失屬性,例如扁平縮進和一個異常通道。


查看完整回答
反對 回復 2019-05-20
  • 2 回答
  • 0 關注
  • 656 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

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

公眾號

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