2015-05-04 45 views
1

所以我創建了一個服務,它向後端發送一條消息來檢查某個特定的電子郵件地址是否已經在數據庫中。在服務中使用promise但不返回承諾

userDB.emailExists = function() 
{ 

    var returnVal; 

    $http.get('?backend=users&email=myemail%40mydomain.com') 
     .success(function(data) { returnVal = data.count ? true : false; }) 
     .error(function(data) { /* TODO error handling */ }); 

     returnVal = data.count ? true : false; 
    }); 

    return returnVal; 
}; 

現在目前這個單元測試(測試,看該功能是否返回truefalse)與Expected undefined to be truthy.失敗。我想我明白了爲什麼;作爲承諾只返回一個'佔位符',所以當我們到達'返回'聲明時,returnVal尚未設置。

唯一的問題是,我不知道如何解決這個問題;我不想回復承諾,因爲這似乎是一個不必要的複雜層次結果是一個簡單的真實或錯誤

+0

你can'd做到這一點,因爲你正在一個異步調用....看看如何處理它 - http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call –

回答

3

唯一的問題是,我不知道如何解決這個問題;我不希望返回的承諾,因爲這似乎是複雜的不必要的層時,結果是一個簡單的真或假

返回的承諾(或採取回調) - 這是根本如何在Angular的async io和瀏覽器JavaScript中完成編碼。見this question for the conceptual explanation

從概念上講,你所說的複雜性已經存在,因爲你的函數在概念上不返回真/假,它執行網絡請求並根據結果返回真/假。

你應該然而 - 返回該true/false價值和承諾$http要求:

userDB.emailExists = function() { 
    return $http.get('?backend=users&email=myemail%40mydomain.com') 
     .then(function(r) { return Boolean(r.data.count); }); 
};