Angular js在返回之前等待数据

时间:2017-06-21 22:31:20

标签: javascript angularjs asynchronous

我有一个有角度的服务,我在那里打了一个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,我无法得到它。

3 个答案:

答案 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;
    });