同步服务对控制器变量的异步响应
Sync Service's Async-Response to Controller Variable
我很难在服务和控制器之间使用承诺和传递信息。
下面的代码起作用,因为它进行调用,我得到承诺,我对它们执行工作等。我现在想将状态消息传递回控制器,但我无法弄清楚到 return 他们到控制器。
如何将 myService
的非承诺响应与我的控制器变量同步?或者我应该 return 将 $q.all
承诺返回给控制器,然后让控制器调用 statusService
?
理想情况下,我希望控制器只是 "fire and forget" 并等待状态响应,以便我可以更新模态。
控制器
function doWork() {
myService.doSomeWork();
// what I'm going for:
// var statusMessage = myService.doSomeWork(sharedDataService.onThisThing);
}
服务
factory.doSomeWork = function() {
var promises = [
queryApi("firstApiCall"),
queryApi("secondApiCall")
];
$q.all(promises)
.then(function(res) {
workService.doSomething(res[0].data, res[1].data);
console.log("response:", res);
// I want to return a string, or object, back to a variable in my controller
//return statusService.getStatusMessage(res[0]);
}, function(err) {
console.log("error:", err);
//return statusService.getStatusMessage(err);
}
);
};
function queryApi(url) {
return $http.get(url);
}
如有任何帮助,我们将不胜感激。
您可以像
这样的服务进行回调
factory.doSomeWork = function(callback) {
var promises = [
queryApi("firstApiCall"),
queryApi("secondApiCall")
];
$q.all(promises)
.then(function(res) {
//do a callback
callback(res)
}, function(err) {
console.log("error:", err);
}
);
};
并且在您的控制器中您可以收到结果
function doWork() {
myService.doSomeWork(function(result){
//handle the result
});
}
在AngularJS中,异步服务应该return a promise. To transform promise data in a service, be sure to return转换后的数据到.then
方法处理函数:
factory.doSomeWork = function() {
var promises = [
queryApi("firstApiCall"),
queryApi("secondApiCall")
];
̲r̲e̲t̲u̲r̲n̲ $q.all(promises)
.then(function successHandler(res) {
workService.doSomething(res[0].data, res[1].data);
console.log("response:", res);
// I want to return a string, or object, back to a variable in my controller
̲r̲e̲t̲u̲r̲n̲ transformedData;
}, function rejectionHandler(err) {
console.log("error:", err);
̶/̶/̶r̶e̶t̶u̶r̶n̶ ̶s̶t̶a̶t̶u̶s̶S̶e̶r̶v̶i̶c̶e̶.̶g̶e̶t̶S̶t̶a̶t̶u̶s̶M̶e̶s̶s̶a̶g̶e̶(̶e̶r̶r̶)̶;̶
̲t̲h̲r̲o̲w̲ statusService.getStatusMessage(err);
}
);
};
在拒绝处理程序中使用 throw statement 很重要。否则,被拒绝的承诺将转换为成功的承诺。
在控制器中:
function doWork() {
var promise = myService.doSomeWork();
promise.then(function(transformedData) {
console.log(transformedData);
}).catch(function(err) {
console.log(err);
});
// what I'm going for:
// var statusMessage = myService.doSomeWork(sharedDataService.onThisThing);
}
有关详细信息,请参阅 You're Missing the Point of Promises。
我很难在服务和控制器之间使用承诺和传递信息。
下面的代码起作用,因为它进行调用,我得到承诺,我对它们执行工作等。我现在想将状态消息传递回控制器,但我无法弄清楚到 return 他们到控制器。
如何将 myService
的非承诺响应与我的控制器变量同步?或者我应该 return 将 $q.all
承诺返回给控制器,然后让控制器调用 statusService
?
理想情况下,我希望控制器只是 "fire and forget" 并等待状态响应,以便我可以更新模态。
控制器
function doWork() {
myService.doSomeWork();
// what I'm going for:
// var statusMessage = myService.doSomeWork(sharedDataService.onThisThing);
}
服务
factory.doSomeWork = function() {
var promises = [
queryApi("firstApiCall"),
queryApi("secondApiCall")
];
$q.all(promises)
.then(function(res) {
workService.doSomething(res[0].data, res[1].data);
console.log("response:", res);
// I want to return a string, or object, back to a variable in my controller
//return statusService.getStatusMessage(res[0]);
}, function(err) {
console.log("error:", err);
//return statusService.getStatusMessage(err);
}
);
};
function queryApi(url) {
return $http.get(url);
}
如有任何帮助,我们将不胜感激。
您可以像
这样的服务进行回调 factory.doSomeWork = function(callback) {
var promises = [
queryApi("firstApiCall"),
queryApi("secondApiCall")
];
$q.all(promises)
.then(function(res) {
//do a callback
callback(res)
}, function(err) {
console.log("error:", err);
}
);
};
并且在您的控制器中您可以收到结果
function doWork() {
myService.doSomeWork(function(result){
//handle the result
});
}
在AngularJS中,异步服务应该return a promise. To transform promise data in a service, be sure to return转换后的数据到.then
方法处理函数:
factory.doSomeWork = function() {
var promises = [
queryApi("firstApiCall"),
queryApi("secondApiCall")
];
̲r̲e̲t̲u̲r̲n̲ $q.all(promises)
.then(function successHandler(res) {
workService.doSomething(res[0].data, res[1].data);
console.log("response:", res);
// I want to return a string, or object, back to a variable in my controller
̲r̲e̲t̲u̲r̲n̲ transformedData;
}, function rejectionHandler(err) {
console.log("error:", err);
̶/̶/̶r̶e̶t̶u̶r̶n̶ ̶s̶t̶a̶t̶u̶s̶S̶e̶r̶v̶i̶c̶e̶.̶g̶e̶t̶S̶t̶a̶t̶u̶s̶M̶e̶s̶s̶a̶g̶e̶(̶e̶r̶r̶)̶;̶
̲t̲h̲r̲o̲w̲ statusService.getStatusMessage(err);
}
);
};
在拒绝处理程序中使用 throw statement 很重要。否则,被拒绝的承诺将转换为成功的承诺。
在控制器中:
function doWork() {
var promise = myService.doSomeWork();
promise.then(function(transformedData) {
console.log(transformedData);
}).catch(function(err) {
console.log(err);
});
// what I'm going for:
// var statusMessage = myService.doSomeWork(sharedDataService.onThisThing);
}
有关详细信息,请参阅 You're Missing the Point of Promises。