2017-09-26 44 views
0

我正在嘗試理解Promoting在Angular 1.0.7中的工作方式,但語法和概念對我來說很難。我創建了一個相關的以前的帖子Nesting promises with $resources in AngularJS 1.0.7,這工作正常。然而,當我嘗試做同樣的事情,但用$http服務替換$resource,那麼它不適合我的預期。

代碼從未等待承諾來,我沒有得到任何結果。

我附上代碼:

// URL has to be parsed to get the destination, language and boatType  
var parseURL = function() { 
    var language = $routeParams.language; 
    var url = $location.path(); 

    var deferred = $q.defer(); 
    var promise = deferred.promise; 
    promise.then(function success(result) { 
     var destination = result; 
     console.log("destination:" + destination); 
     searchBoats(destination); 
    }); 

    parseDestination(url, language).then(deferred.resolve); 
}; 
parseURL(); 

var parseDestination = function(url, language) { 
    console.log("parseDestination.begin"); 
    var departure = UrlService.parseUrlDeparture(url); 

    var deferred = $q.defer(), 
     promise = deferred.promise; 
    TranslationService.getTranslatedDeparture(departure, language, API_SERVER_URL, deferred.resolve, deferred.reject); 
    return promise; 
}; 


// The function in the service 
getTranslatedDeparture: function(destination, language, api) { 
    var defered = $q.defer(); 
    var destinationPromise = defered.promise; 
    $http.get("http://" + api + "/translatedDepartures?departure=" + destination + ";lang=" + language + ";matchStart=" + true).then(
     //var destination = result.data.map(function (source) { return source.element_translation; }); 
     defered.resolve 
    ); 
    return destinationPromise; 
} 
+0

要使用的角度1.0.7不應該一個問題。我們有一個完整的大網站開發,它的工作完美。根據你的第二點,我們試圖對代碼進行重新分解,因爲我們有許多依賴關係和許多不遵循單一責任規則的函數。那麼,你能否提供一個滿足這個規則的工作示例? – Rober

+0

要遷移到更新版本的Angular,此時此刻不是一種選擇。對這個問題應該有一個更加溫和的方法,你不覺得嗎? – Rober

+0

@Claies問題不在於Angular 1.0.7,所以我沒有看到任何有害的答案。 – JLRishe

回答

2

您正在使用承諾不對幾乎在每個方面都可以想象。承諾旨在被鏈接並使用.then()創建新的承諾。這樣做會解決你的錯誤,並將你的代碼長度減半。只要你有一個承諾開始(你這樣做,因爲$http.get返回一個承諾),你不需要和不應該使用,$q.defer()

// URL has to be parsed to get the destination, language and boatType  
var parseURL = function() { 
    var language = $routeParams.language; 
    var url = $location.path(); 

    parseDestination(url, language) 
     .then(function (result) { 
      var destination = result; 
      console.log("destination:", destination); 
      searchBoats(destination); 
     });  
}; 
parseURL(); 

var parseDestination = function(url, language) { 
    console.log("parseDestination.begin"); 
    var departure = UrlService.parseUrlDeparture(url); 

    return TranslationService.getTranslatedDeparture(departure, language, API_SERVER_URL);  
}; 


// The function in the service 
getTranslatedDeparture: function(destination, language, api) { 
    var url = "http://" + api + "/translatedDepartures?departure=" + destination + ";lang=" + language + ";matchStart=" + true; 

    return $http.get(url) 
     .then(function (result) { return result.data; }); 
} 
+0

感謝您的幫助示例。我喜歡嘗試解釋問題並添加實例的人。然而,我的代碼不工作,我得到無法讀取該行中未定義的屬性'then':parseDestination(url,language).then(function(result){。它與我的角度版本有關嗎? – Rober

+0

@Rober你將代碼完全複製,因爲它沒有任何改變?我沒有看到'parseDestination()'可以在沒有錯誤的情況下完成,但是在描述的位置出現錯誤。 – JLRishe

+0

對不起! !它工作的很好! – Rober