Javascript 返回前等待数据
我有一个angular服务,在那里我进行http post调用。此外,还设置了一些常量值。最后,我使用return将这些数据发送到控制器,执行一些逻辑并在视图中显示它们 服务代码:Javascript 返回前等待数据,javascript,angularjs,asynchronous,Javascript,Angularjs,Asynchronous,我有一个angular服务,在那里我进行http post调用。此外,还设置了一些常量值。最后,我使用return将这些数据发送到控制器,执行一些逻辑并在视图中显示它们 服务代码: var apiurl = 'myurl'; var apidata = {data: 'mydata'}; var myDataPromise = httppostrequest($http, apiurl, apidata); myDataPromise.then(function(result)
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请求中的数据甚至不会传递给控制器
我曾经使用过NodeJS,在那里有一些方法和工具可以在需要时避免异步性。对于angularjs,我不明白。无论你有什么回报,你都必须将其放入成功方法中。否则你会看到这个问题 您可以这样做:
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.");
});
你完美地描述了正在发生的事情。 因此,我的建议是将服务中
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);
});
在result函数中返回您的服务
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;
});
我试过了。现在不会返回任何内容,尽管then块已成功执行。此外,没有错误(我更改了catch块中的日志,以便它显示错误)该服务是角度服务吗?@AmeliaGrimaldi您可以做的是创建一个服务,然后为数据添加setter和getter。然后,一旦从http调用中获得数据,通过setter添加数据,然后在访问数据时,通过getter访问数据。这是唯一的方法。万一我误解了,你是不是建议我把服务注入到其他地方(比如控制器)?是的,没错,你得到了它。谢谢,这确实有效。我想我也理解它的逻辑。