2017-01-16 54 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