2016-08-09 42 views
3

我有HTTP服務,它返回承諾到inspection2update.DamageTypeId屬性並繼續執行更多。angularjs http服務等待數據

HTTP服務:

function post(objectTypeId, damageDescription) { 
    var defer = $q.defer(); 
    $http.post(serviceAddress + "save/" + objectTypeId + "/" + damageDescription).then(function (response) { 
     defer.resolve(response.data); 
    }); 
    return defer.promise; 
} 

在這裏,我如何在控制器調用服務:

inspection2update.DamageTypeId = damageTypesService.save(inspection2update.ObjectTypeId, self.dType); 

但我要等到我從業務數據後,才,進一步執行。

爲此,我在$ http resolver中使用$q服務,但仍然得到我的服務承諾,並且沒有數據。

我需要更改我的代碼以使服務等待數據嗎?

回答

2

您正在返回一個承諾,在http調用完成獲取數據後解決。使用這項服務的消費者需要等待解決的承諾,並且對數據做些什麼。

使用then語法收到承諾的數據,並進一步執行:

damageTypesService.save(inspection2update.ObjectTypeId, self.dType).then(function(data) { 
    inspection2update.DamageTypeId = data; 
    // rest of execution... 
}); 

PS - 據我可以看到有你的情況沒有用的$q(除非你想用數據打成一片/製作日誌等)。您可以返回$http呼叫作爲是:

function save(objectTypeId, damageDescription) { 
    return $http.post(serviceAddress + "save/" + objectTypeId + "/" + damageDescription); 
} 
2

用最好的角度promise$q

function save (objectTypeId, damageDescription) { 
    var deferred = $q.defer(); 

    $http({ 
    url: serviceAddress + "save/" + objectTypeId + "/" , 
    method: 'POST', 
    data: damageDescription 
    }) 
    .success(function (data) { 
    deferred.resolve(data); 
    }) 
    .error(function (data) { 
    deferred.resolve(data); 
    }); 

    return deferred.promise; 
} 

而在你的控制器使用.then功能

damageTypesService.save(inspection2update.ObjectTypeId, self.dType).then(function(response){ 
    /*use the response here 
    eg: inspection2update.DamageTypeId = response.id 
    */ 
    }) 
+0

deferred.resolved(data)是什麼意思?數據將在呼叫回復時解決。 –

2

首先,你必須您的服務方法名爲post,並且您正在調用名爲save的方法。這是一個錯誤嗎?其次,我不認爲你應該使用$http服務的任何理由,它是低層次的,你的要求很簡單。您應該結賬$resource它提供了更高級別的抽象,並且可以用於像您這樣的簡單請求。現在,解決你的問題。 $http$resource總是返回一個承諾。所以,通常在您的服務或控制器中,您提供了一個回調,它將從請求接收到的響應進行處理。由於$ resource和$http的方法是類似的,但您詢問$http我會告訴您使用$http

function post(objectTypeId, damageDescription) { 
return $http.post(serviceAddress + "save/" + objectTypeId + "/" + damageDescription); 
} 

現在,在您的控制器調用服務方法post()這樣。

damageTypesService.post(inspection2update.ObjectTypeId, self.dType).then(mycallback); 


function myCallback(response){ 
    inspection2update.DamageTypeId = response; // DamageTypeId now won't be populated until the request is resolved. 
} 
+0

我嘗試在我的示例中使用它以獲得它,並且它的劑量很大 – Michael

+0

請爲您的示例提供這些更改的代碼。並解釋「不起作用的意義」。你收到什麼錯誤? –