所以我正在处理一个项目,我有一个数据集,我必须通过从服务器检索数据,根据用户输入检索所述数据集的各种统计数据。
我正在尝试设置一个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对象。我用来发送超出"成功"范围之外的信息的任何方法。给了我一个承诺对象。为什么是这样?有没有办法解决这个问题?处理控制器中的错误处理似乎非常低效。
答案 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);
}
您的代码将调用的结果返回到成功,这确实是一种承诺。