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

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

這是“遞延反模式”嗎?

這是“遞延反模式”嗎?

守候你守候我 2019-06-05 16:03:26
這是“遞延反模式”嗎?我發(fā)現(xiàn)很難理解“延遲反模式”。我想我在原則上理解它,但我還沒有看到一個(gè)非常簡(jiǎn)單的服務(wù)例子,有著不同的承諾和反模式,所以我想我會(huì)嘗試做我自己的,但考慮到我對(duì)它的了解不是很好,我會(huì)首先得到一些澄清。我在一家工廠里有以下情況://url = 'data.json';return {     getData: function(){         var deferred = $q.defer();         $http.get(destinationFactory.url)             .then(function (response) {                 if (typeof response.data === 'object') {                     deferred.resolve(response.data);                 } else {                     return deferred.reject(response.data);                 }             })             .catch(function (error) {             deferred.reject(error);         });         return deferred.promise;     }我之所以檢查它是一個(gè)對(duì)象,只是為了將一個(gè)簡(jiǎn)單的驗(yàn)證層添加到$http.get()以下是我的指令:this.var = SomeFactory.getData()     .then(function(response) {         //some variable = response;     })     .catch(function(response) {         //Do error handling here});現(xiàn)在對(duì)我來說,這是一個(gè)反模式。因?yàn)樽畛醯难舆t承諾捕獲了錯(cuò)誤并簡(jiǎn)單地吞噬了它。它不返回錯(cuò)誤,所以當(dāng)調(diào)用這個(gè)“getData”方法時(shí),我必須執(zhí)行另一個(gè)捕獲來獲取錯(cuò)誤。如果這不是反模式,那么有人能解釋為什么兩者都需要某種“回調(diào)”嗎?當(dāng)我第一次開始寫這個(gè)工廠/指令的時(shí)候,我預(yù)料到必須在某個(gè)地方履行一個(gè)不遵守的承諾,但我并沒有預(yù)料到.catch()在雙方(也就是我的意思是,我想我可以讓工廠返回響應(yīng)或錯(cuò)誤,如果我做了SomeFactory.getData()
查看完整描述

3 回答

?
眼眸繁星

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

這是“遞延反模式”嗎?

是的,是的。“延遲反模式”發(fā)生在創(chuàng)建一個(gè)新的冗余延遲對(duì)象以從承諾鏈內(nèi)部解析時(shí)。..在您的情況下,您使用$q來返回某個(gè)隱含返回承諾的承諾。您已經(jīng)有了一個(gè)承諾對(duì)象($http service本身返回promise所以你只需要把它還回去!

下面是一個(gè)非常簡(jiǎn)單的例子,它展示了服務(wù)的延遲承諾和反模式,

這是反模式

app.factory("SomeFactory",['$http','$q']){
    return {
        getData: function(){
            var deferred = $q.defer();            
            $http.get(destinationFactory.url)
              .then(function (response) {        
                 deferred.resolve(response.data);
            })
              .catch(function (error) {
                deferred.reject(error);
            });            
            return deferred.promise;
        }
     }}])

這就是你應(yīng)該做的

app.factory("SomeFactory",['$http']){
    return {
        getData: function(){
           //$http itself returns a promise 
            return $http.get(destinationFactory.url);
        }}

而它們都是以同樣的方式被消耗的。

this.var = SomeFactory.getData()
    .then(function(response) {
        //some variable = response;
    },function(response) {
        //Do error handling here});

這兩個(gè)例子都沒有什么問題(至少在語法上是這樣).但是第一個(gè)例子是多余的,而不是必需的!

希望有幫助:)


查看完整回答
反對(duì) 回復(fù) 2019-06-05
?
翻過高山走不出你

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

我想說的是經(jīng)典延遲反模式,因?yàn)槟趧?chuàng)建不必要的延遲對(duì)象。但是,您正在為鏈添加一些價(jià)值(通過驗(yàn)證)。通常情況下,當(dāng)延遲對(duì)象被創(chuàng)建時(shí),反模式是特別糟糕的。

所以,代碼可能要簡(jiǎn)單得多。

$q承諾有一個(gè)文檔化的特性,自動(dòng)包裝在承諾中返回的任何內(nèi)容(使用$q.when)。在大多數(shù)情況下,這意味著您不必手動(dòng)創(chuàng)建延遲:

var deferred = $q.defer();

但是,這就是文檔如何演示如何使用$q.

因此,您可以將代碼更改為:

return {
    getData: function(){
        return $http.get(destinationFactory.url)
            .then(function (response) {
                if (typeof response.data === 'object') {
                    return response.data;
                } else {
                    throw new Error('Error message here');
                }
            });

            // no need to catch and just re-throw
        });
    }


查看完整回答
反對(duì) 回復(fù) 2019-06-05
  • 3 回答
  • 0 關(guān)注
  • 526 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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