Javascript 返回前等待数据

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)

我有一个angular服务,在那里我进行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请求中的数据甚至不会传递给控制器


我曾经使用过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访问数据。这是唯一的方法。万一我误解了,你是不是建议我把服务注入到其他地方(比如控制器)?是的,没错,你得到了它。谢谢,这确实有效。我想我也理解它的逻辑。