慕森王
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構(gòu)造函數(shù)反模式 ”,這個代碼有什么不好,為什么這被稱為反模式?
2 回答

ibeautiful
TA貢獻1993條經(jīng)驗 獲得超6個贊
Esailija創(chuàng)造的延遲反模式(現(xiàn)在是明確構(gòu)建的反模式)是一種常見的反模式人物,他們是新的承諾,我在我第一次使用承諾時自己創(chuàng)造了。上述代碼的問題在于無法利用promises鏈的事實。
承諾可以鏈接,.then
你可以直接返回承諾。您的代碼getStuffDone
可以重寫為:
function getStuffDone(param){ return myPromiseFn(param+1); // much nicer, right?}
Promise都是為了使異步代碼更具可讀性,并且表現(xiàn)得像同步代碼而不隱藏這一事實。Promise表示對一次操作的值的抽象,它們在編程語言中抽象出語句或表達式的概念。
在將API轉(zhuǎn)換為promises并且無法自動執(zhí)行時,或者當您編寫更容易表達的聚合函數(shù)時,您應(yīng)該只使用延遲對象。
引用Esailija:
這是最常見的反模式。當你不真正理解承諾并將它們視為美化事件發(fā)射器或回調(diào)實用程序時,很容易陷入這種情況。讓我們回顧一下:promises是關(guān)于使異步代碼保留同步代碼的大部分丟失屬性,例如扁平縮進和一個異常通道。
添加回答
舉報
0/150
提交
取消