2017-01-16 55 views
0

我有一項服務(當它全部說完並完成時)更新數據庫上的值。來自Angular服務的退貨承諾

我想基於結果(成功/失敗)更新視圖範圍,但當然服務使用的http請求是異步的,所以返回值不是立即可用的,並且在控制器中出現未定義。

如果我在控制器內部發出http請求,我會更新回調函數中的範圍,但是因爲我使用的是服務,範圍的umm ... scope(?)不可用。

我在想一個Promise是我需要回來的東西,但也許有一些更簡單的東西。

服務

.service('doStuff',function($http){ 

    this.update = function(data) { 

     $http.post('http://api.internet', data).then(function(res){ 

      return(res.data.result); 

     }); 

    } 

}) 

CONTROLLLER

/* service is injected into controller etc. */ 

var result = doStuff.update(data); 

p(result); // undefined (as expected) 

我因爲即時通訊從HTTP回調返回算了一下,它會等待結果可用在返回前,但我想我在想念一些東西。

+1

你的方法'this.update'實際上不返回任何東西。你需要將它改爲'return $ http.post(..)' –

回答

1

最重要的,你需要返回查詢本身。看起來像

this.update = function(data) { 

    return $http.post('http://api.internet', data).then(function(res){ 

     return(res.data.result); 

    }); 

} 

下一步,你需要擺脫promise功能。

doStuff.update(data) 
    .then(function(res) { 
    //someone if request is success 
    }) 
    .catch(function(rej) { 
    //someone if request is reject 
    }); 
3

由於$http始終是異步的,因此無法在回調函數中返回任何內容。這是一樣好,不返回任何東西。

您需要做的是您需要返回$http承諾,然後處理控制器中的回調函數。

服務:

.service('doStuff', function($http) { 
    this.update = function(data) { 
    return $http.post('http://api.internet', data); 
    } 
}) 

控制器:

doStuff.update(data).then(function(result){ 
    p(result); 
}); 
+0

,所以實際上,OP只需要在'$ http.post' –

+0

啊之前添加'return'!這就說得通了。謝謝!! – yevg