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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

被束縛的承諾不會(huì)被拒絕

被束縛的承諾不會(huì)被拒絕

溫溫醬 2019-06-20 15:52:13
被束縛的承諾不會(huì)被拒絕我很難理解為什么拒絕不能通過(guò)承諾鏈傳遞,我希望有人能幫助我理解其中的原因。對(duì)我來(lái)說(shuō),將功能附加到一系列的承諾中意味著我依賴(lài)于最初的承諾來(lái)實(shí)現(xiàn)它的意圖。很難解釋?zhuān)宰屛蚁冉o出一個(gè)問(wèn)題的代碼示例。(注意:此示例使用Node和延遲節(jié)點(diǎn)模塊。我用Dojo 1.8.3進(jìn)行了測(cè)試,得到了相同的結(jié)果)var d = require("deferred");var d1 = d();var promise1 = d1.promise.then(     function(wins) { console.log('promise1 resolved'); return wins;},     function(err) { console.log('promise1 rejected'); return err;});var promise2 = promise1.then(     function(wins) { console.log('promise2 resolved'); return wins;},     function(err) { console.log('promise2 rejected'); return err;});var promise3 = promise2.then(     function(wins) { console.log('promise3 resolved'); return wins;},     function(err) { console.log('promise3 rejected'); return err;});d1.reject(new Error());運(yùn)行此操作的結(jié)果是以下輸出:promise1 rejected promise2 resolved promise3 resolved好吧,對(duì)我來(lái)說(shuō),這個(gè)結(jié)果沒(méi)有意義。通過(guò)附加到這個(gè)承諾鏈上,每個(gè)承諾鏈都意味著它將依賴(lài)于D1的成功解決,并將結(jié)果傳遞到該鏈中。如果承諾1中的承諾沒(méi)有接收WINS值,而是在其錯(cuò)誤處理程序中獲得錯(cuò)誤值,那么如何使鏈中的下一個(gè)承諾調(diào)用其成功函數(shù)?它不可能將有意義的值傳遞給下一個(gè)承諾,因?yàn)樗旧頉](méi)有得到一個(gè)值。另一種我可以描述的想法是:有三個(gè)人,約翰,金格和鮑勃。約翰擁有一家小玩具店。姜走進(jìn)他的店里,要了一袋五顏六色的小玩意兒。他沒(méi)有庫(kù)存,所以他向他的分銷(xiāo)商發(fā)出了一份請(qǐng)求,要求把它們運(yùn)給他。同時(shí),他給了金格一次改天的機(jī)會(huì),說(shuō)他欠她一袋小工具。Bob發(fā)現(xiàn)Ginger正在獲取這些小部件,并要求在完成這些小部件后獲得藍(lán)色小部件。她同意了,并給了他一張紙條,說(shuō)她會(huì)的?,F(xiàn)在,John的分銷(xiāo)商在他們的產(chǎn)品中找不到任何小部件,制造商也不再生產(chǎn)這些小部件,所以他們通知John,John反過(guò)來(lái)告訴Ginger她無(wú)法獲得這些小部件。鮑勃怎么能從金格那里得到一個(gè)藍(lán)色的小部件,而她卻沒(méi)有得到任何東西呢?我對(duì)這個(gè)問(wèn)題的第三個(gè)更現(xiàn)實(shí)的觀點(diǎn)是這一點(diǎn)。假設(shè)我有兩個(gè)要更新到數(shù)據(jù)庫(kù)的值。一個(gè)依賴(lài)于另一個(gè)的id,但是在我已經(jīng)將它插入數(shù)據(jù)庫(kù)并獲得結(jié)果之前,我無(wú)法獲得id。除此之外,第一個(gè)INSERT依賴(lài)于來(lái)自數(shù)據(jù)庫(kù)的查詢(xún)。數(shù)據(jù)庫(kù)調(diào)用返回承諾,用于將兩個(gè)調(diào)用鏈接到一個(gè)序列中?,F(xiàn)在,在這種情況下,如果db.query失敗,它將調(diào)用第一個(gè)查詢(xún)的err函數(shù)。但是,它會(huì)把下一個(gè)承諾的成功函數(shù)稱(chēng)為“成功函數(shù)”。雖然這個(gè)承諾是期望第一個(gè)值的結(jié)果,但是它將從它的錯(cuò)誤處理程序函數(shù)中得到錯(cuò)誤消息。所以,我的問(wèn)題是,如果我必須測(cè)試我的成功函數(shù)中的錯(cuò)誤,為什么我會(huì)有一個(gè)錯(cuò)誤處理函數(shù)呢?很抱歉這么長(zhǎng)時(shí)間。我只是不知道怎么用另一種方式來(lái)解釋
查看完整描述

3 回答

?
智慧大石

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊

首先正如評(píng)論者所指出的,在使用延遲庫(kù)時(shí),您的第一個(gè)示例肯定會(huì)產(chǎn)生您期望的結(jié)果:

promise1 rejected
promise2 rejected
promise3 rejected

其次,即使它會(huì)產(chǎn)生您建議的輸出,它也不會(huì)影響第二個(gè)片段的執(zhí)行流,這有點(diǎn)不同,更像是:

promise.then(function(first_value) {
    console.log('promise1 resolved');
    var promise = db.put(first_value);
    promise.then(function (second_value) {
         console.log('promise2 resolved');
         var promise = db.put(second_value);
         promise.then(
             function (wins) { console.log('promise3 resolved'); },
             function (err) { console.log('promise3 rejected'); return err; });
    }, function (err) { console.log('promise2 rejected'); return err;});}, function (err) { console.log('promise1 rejected'); return err});

而且,如果第一次承諾被拒絕,就會(huì)產(chǎn)生這樣的結(jié)果:

promise1 rejected

然而(進(jìn)入最有趣的部分)即使延遲的庫(kù)肯定會(huì)返回3 x rejected,大多數(shù)其他承諾庫(kù)將返回。1 x rejected, 2 x resolved(這會(huì)導(dǎo)致假設(shè)您通過(guò)使用其他承諾庫(kù)來(lái)獲得這些結(jié)果)。

另外,令人困惑的是,其他庫(kù)的行為更正確。讓我解釋一下。

在同步世界中,“拒絕承諾”的對(duì)應(yīng)詞是throw..所以在語(yǔ)義上,異步deferred.reject(new Error())同步等于throw new Error()..在您的示例中,您沒(méi)有在同步回調(diào)中拋出錯(cuò)誤,您只是返回它們,因此切換到成功流,錯(cuò)誤是成功的值。為了確保拒絕得到進(jìn)一步通過(guò),您需要重新拋出錯(cuò)誤:

function (err) { console.log('promise1 rejected'); throw err; });

所以現(xiàn)在的問(wèn)題是,為什么延遲庫(kù)將返回的錯(cuò)誤作為拒絕?

原因是,在推遲的情況下,拒絕的工作方式有點(diǎn)不同。在延遲庫(kù)中,規(guī)則是:承諾在被錯(cuò)誤實(shí)例解析后被拒絕所以即使你這么做deferred.resolve(new Error())它將充當(dāng)deferred.reject(new Error()),如果你想做deferred.reject(notAnError)它會(huì)拋出一個(gè)異常,也就是說(shuō),只有在錯(cuò)誤的情況下才能拒絕承諾。這說(shuō)明了為什么從then回調(diào)拒絕承諾。

遞延邏輯背后有一些合理的推理,但它仍與如何做到這一點(diǎn)相去甚遠(yuǎn)。throw在JavaScript中工作,并且由于此行為計(jì)劃更改版本V0.7的延遲。

摘要:

為了避免混亂和意想不到的結(jié)果,只需遵循良好的實(shí)踐規(guī)則:

  1. 始終用錯(cuò)誤實(shí)例拒絕您的承諾(遵循同步世界的規(guī)則,其中拋出不是錯(cuò)誤的值被認(rèn)為是錯(cuò)誤的做法)。
  2. 從同步回調(diào)中拒絕

    投擲

    錯(cuò)誤(返回錯(cuò)誤不能保證拒絕)。

遵循以上所述,您將在延遲庫(kù)和其他流行的承諾庫(kù)中獲得一致和預(yù)期的結(jié)果。


查看完整回答
反對(duì) 回復(fù) 2019-06-20
  • 3 回答
  • 0 關(guān)注
  • 556 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)