我有一个有角度的服务,我在那里打了一个http post电话。此外,还设置了一些常量值。最后,我使用return将这些数据发送到控制器,做一些逻辑并在视图中显示它们。
服务代码:
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
});
}
请求成功并返回数据。问题是该行
退回服务;
在将请求的数据分配给服务变量之前执行。因此,来自post请求的数据甚至不会传递给控制器。
我使用过节点js,其中有方法和工具可以在需要时避免异步性质。对于angularjs,我无法得到它。
答案 0 :(得分:3)
你完美地描述了发生了什么。
所以我的建议是将服务中的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);
});
答案 1 :(得分: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.");
});
答案 2 :(得分: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;
});