2016-05-09 43 views
3

我正在對REST服務進行調用,該服務返回true或false。角度承諾區別本地主機vs部署

function topLevelClosed($stateParams) { 
    var id = $stateParams.id; 
    return id ? Traject.topLevelClosed({id: id}).$promise : false; 
} 

var topLevelClosed = { 
    method: 'GET', 
    url: trajectURL + ':id/topLevelClosed' 
}; 

topLevelClosed是$ resource方法。這工作完全localhost。 topLevelClosed var是'false',它等於REST調用返回的值。 但是,當部署到Google App Engine時,我會得到結果「包裹在承諾中」,如下圖所示。但是,當我通過瀏覽器窗口調用REST服務時,它應該返回false。

promise result when deployed

promise result on localhost

爲什麼不這項工作時,部署?

回答

2

您描述的行爲是我期望的代碼。當你的函數返回一個承諾您的通話將這個樣子

topLevelClosed($stateParams).then(function(value){ 
    /* do something with value */ 
}); 

如果不是topLevelClosed返回一個布爾值,那麼你可以直接訪問值沒有then(...)

要獲得一致的行爲,我總是會返回一個承諾,就像這樣:

function topLevelClosed($stateParams) { 
    var deferred = $q.defer(); 
    if(id){ 
    Traject.topLevelClosed({id: id}).$promise.then(function(value){ 
     deferred.resolve(value); 
    }); 
    } else { 
    deferred.resolve(false); 
    } 
    return $q.promise; 
} 

嗯,這不是因爲漂亮,我希望這將是,但你可以改善它。不過,我建議您始終使用一致的返回類型。當你混合布爾和承諾時,你必須在繼續之前分析返回值的類型。

+0

他正在注入'$ stateParams',所以這很可能是一種解決方法。在解決方法中,不管你是否返回一個承諾,如果它是一個承諾,路由器會爲你解決它,所以你總是會得到解決的承諾,或者在這種情況下,原始的'false ' –

+0

@NexusDuck您可能想詳細說明ui路由器中$ resource方法的結果如何自動解析。我在這裏沒有看到注射。我唯一看到的是帶有參數的函數,我不知道如何調用該函數。 – konqi

+0

那麼,[$ stateParams](https://github.com/angular-ui/ui-router/wiki/URL-Routing#user-content-stateparams-service)是一個ui路由器服務,通常用於解析函數 –