2016-07-24 17 views
1

我只是一個有關於這段代碼的簡單查詢:

服務代碼:

function getUser($q, $http) { 
    return $http.get('...').then(function(response) { 
    return response.data; 
    }); 
} 

控制器代碼:

// getUser's consuming code 
getUser().then(
    function(data) { // Success callback 
    // Do something about data 
    }, 
    function(response) { // Error callback 
    // How does this error callback gets called ?? 
    } 
); 

如果get用戶http調用發生一些錯誤。我無法理解錯誤回調在控制器中的調用方式(內部工作)
我問這個的原因是因爲我認爲我們要調用的拒絕方法(遞延對象)在服務的話,錯誤回調使得則後續的錯誤回調(一種在控制器)被稱爲。

function getUser($q, $http) { 
    return $http.get('...').then(function(response) { 
    return response.data; 
    },function(response){ 
    return $q.reject(response) 
    }); 
} 

但如何當我們不從第一則錯誤回調(服務裏面的一個),這相當於一個錯誤返回任何的控制器則錯誤回調被調用。

+1

這就是promises的工作原理。如果你的代碼像'promiseA.then(promiseB).then(promiseC).then(promiseD).then(success,failure)'和'promiseB'拒絕,那麼'promiseC'和'promiseD'將被跳過,並且'failure'方法將被執行 –

+0

@KirillSlatin因此,本質上如果發生了一些錯誤,那麼不管下一個方法是否擁有它或其他任何鏈接?都會調用下一個可用的失敗方法? –

+0

是的,@ bhavya_w,這是正確的 –

回答

1

內部運作是這樣的:then返回新承諾其等待當初的諾言得到解決,並

  • 如果原來是解決

    • ,如果你」已經註冊瞭解決方案回調,呼叫您的回撥,並用您的回撥返回的值解決問題

    • 如果您還沒有註冊分辨率回調,自行解決與原承諾的分辨率值

  • 如果原來被拒絕

    • ,如果你已經註冊了一個拒絕回調,調用你的回調和拒絕本身的回調價值回撥

    • 如果你還沒有註冊拒絕回撥,拒絕本身無線TH由最初的承諾所提供的拒絕值

,你可以想像then實施爲非常粗略沿着這些線路概念

function then(whenResolved, whenRejected) { 
    return new Promise(function(resolve, reject) { 
     whenOriginalIsResolved(function(resolution) { 
      if (typeof whenResolved === "function") { 
       try { 
        resolution = whenResolved(resolution); 
       } catch (e) { 
        reject(e); 
        return; 
       } 
      } 
      resolve(resolution); 
     }); 
     whenOriginalIsRejected(function(rejection) { 
      if (typeof whenRejected === "function") { 
       try { 
        rejection = whenRejected(rejection); 
       } catch (e) { 
        reject(e); 
        return; 
       } 
      } 
      reject(rejection); 
     }); 
    }); 
} 

再次,這是概念上的,而不是文字。如果你想看到一個文字實現,Kris Kowal的原始Q實現它here。 (這比Angular使用的輕量級版本稍微複雜一點,不過這是一個很好的例子。)

+0

@bhavya_w:我在說每個承諾。 :-)請記住,你的代碼使用了**兩個不同的promise(並創建了第三個,但是除非你使用'getUser.then'的返回值,我們可以忽略它)。 Promise 1是你從'$ http'獲得的。 Promise 2就是你在Promise 1中調用'then'所得到的結果。因爲你對'$ http.then'的調用沒有給出拒絕處理程序,所以當'then'創建Promise 2時,它將自動拒絕自己如果諾言1被拒絕。例如,默認是鏈接。 –