展开从HTTP服务返回的承诺

时间:2015-08-24 21:36:26

标签: angularjs api http

所以我正在处理一个项目,我有一个数据集,我必须通过从服务器检索数据,根据用户输入检索所述数据集的各种统计数据。

我正在尝试设置一个AngularJS服务,该服务具有各种方法,可返回给定数据点的各种信息。

以下是该服务的公共方法:

function test() {
    return $http.get('blahblah.api.../datapoint1')
    .success(function(data) {
        console.log(data.name);
        return data.name;
    });
}

以下是控制器的相关部分:

self.data = service.test();
console.log(self.data);

有趣的是,http调用成功的console.log(data.name)给了我我想要的内容。给定数据点的名称。 但是,其范围之外的console.log(self.data)为我提供了原始的promise对象。我用来发送超出"成功"范围之外的信息的任何方法。给了我一个承诺对象。为什么是这样?有没有办法解决这个问题?处理控制器中的错误处理似乎非常低效。

3 个答案:

答案 0 :(得分:2)

您没有为您的功能创建新承诺。

查看您的public native long createDataProcessorObject(); public native void processData(long dataProcessor,int sample, int dataLeft); 功能。看看你有两个回报?第一次,您返回test函数,这是一个承诺,但是一个解析为$http.get函数的承诺。您从成功函数返回的内容并未解决该承诺 - 它已在成功函数中得到解决。

相反,您需要为服务功能创建一个新承诺,并将其返回到您的应用程序。

以下是您应如何构建请求

success

<强>实施

function test() {
    // Setup a promies for this function to return
    var deferred = $q.defer()

    $http.get('blahblah.api.../datapoint1')
    .success(function(data) {
        console.log(data.name);

        // Return our data to use in our app
        deferred.resolve(data);
    });

    // Return the promise
    return deferred.promise
}

请注意,您需要在服务中加入service.test().then(function(data){ self.data = data console.log(self.data.name) //should be the same as in your service }); 注射器。

答案 1 :(得分:1)

不,在承诺解决之前,不可能以任何有意义的方式将该值传递到外部范围。您必须在回调中访问它。就错误处理而言,这当然可以由您的服务处理。

function test() {
    return $http.get('blahblah.api.../datapoint1')
    .then(function(response) {
        console.log(response.data.name);
        return response.data.name;
    }).catch(function (e) {
        // error handling...
    });
}
self.data = ''; // default value
service.test().then(function (name) {
    self.data = name;
    console.log(self.data); // correct value
});
console.log(self.data); // still default value

我建议不要使用.success().error()而转而使用.then().catch(),前两个版本在AngularJS的最新版本中已被弃用

答案 2 :(得分:0)

无法使该服务同步,您应该始终使用承诺。

试试这个:

function test() {
    return $http.get('blahblah.api.../datapoint1')
    .success(function(data) {
        console.log(data.name);
        return $q.resolve(data.name);
    });
}

然后这个:

service.test().then(function (name) {
    self.data = name;
    console.log(self.data);
})

修改

关于您获得承诺的原因,您认为您的代码与以下内容相同:

function something(data) {
   console.log(data.name);
   return data.name;
}

function test() {
    return $http.get('blahblah.api.../datapoint1')
    .success(something);
}

您的代码将调用的结果返回到成功,这确实是一种承诺。