2017-06-21 179 views
3

我有一个角度服务,在这里我发起一个http post调用。此外,还设置了一些常数值。最后,我使用return将这些数据发送到控制器,执行一些逻辑并将它们显示在视图中。Angular js在返回之前等待数据

服务码:

var apiurl = 'myurl'; 
    var apidata = {data: 'mydata'}; 
    var myDataPromise = httppostrequest($http, apiurl, apidata); 

    myDataPromise.then(function(result) { 
     service.datas = result; 
     console.log("data.name"+result); 
    }); 
    return service; 

的httppostrequest功能:

function httppostrequest($http, apiurl, apidata){ 
    return $http({ 
     method : "POST", 
     headers: {'Content-Type': 'application/x-www-form-urlencoded'}, 
     url: apiurl, 
     data: JSON.stringify(apidata), 
     timeout: 5000 
    }); 
} 

该请求是成功的,并返回该数据。问题是,该行

返回服务;

在将来自请求的数据分配给服务变量之前执行。因此,来自发布请求的数据甚至不会传递给控制器​​。

我已经使用节点js,在那里有方法和工具,以避免需要时的异步性质。用angularjs我不明白。

回答

2

您描述的完全发生了什么。 所以我的建议是将服务内部的datas的值初始化为一个空值(对象,数组或者取得承诺后的任何内容),将承诺与服务相关联,并将承诺解决方案简单地移动到您真正的位置需要操纵这些数据。所以,你的服务中:

var apiurl = 'myurl'; 
var apidata = {data: 'mydata'}; 
service.datas = []; // if it will be an array for example 
service.myDataPromise = httppostrequest($http, apiurl, apidata); 

return service; 

然后无论你需要它,只是注入你的服务,并做到:

myService.myDataPromise.then(function(result) { 
    myService.datas = result; 
    console.log("data.name"+result); 
}); 
+0

如果我误解了,你是否建议我将服务注入其他地方(例如控制器)? –

+0

是的,你知道了 – quirimmo

+0

谢谢,那实际上工作。我想我也理解它的逻辑。 –

1

无论你有什么回报,你都必须把它放在成功的方法里面。否则,你会看到这个问题。

你可以做这样的事情:

var data = {} //your data 
var promiseURLMetaData = HttpService.httpPost("parseUrlMetadata", data); 
promiseURLMetaData.then(function (response) { 
    var urlMetaData = response.data; 
    return urlMetaData; 
    }) 
.catch(function (error) { 
    console.log("Something went terribly wrong while trying to get URL Meta Data."); 
}); 
+0

试过了。现在没有任何东西会被返回,尽管then块被成功执行。也没有错误(我改变了在catch块中的日志,以便它显示错误) –

+0

该服务是一种角度服务吗? –

+0

@AmeliaGrimaldi你可以做的是有一项服务,然后为数据添加setter和getters。然后,一旦你从http调用中获得数据,通过setter添加它,然后当你访问数据时,通过getter访问它。这是唯一的方法。 –

0

返回结果函数内为您服务。

var apiurl = 'myurl'; 
var apidata = {data: 'mydata'}; 
var myDataPromise = httppostrequest($http, apiurl, apidata); 

    myDataPromise.then(function(result) { 
     service.datas = result; 
     console.log("data.name"+result); 
     return service; 
    }); 
相关问题