我很难使用promises并在服务和控制器之间传递信息。
下面的代码功能,因为它进行调用,我得到了承诺,我对它们执行工作等等。我想现在将状态消息传回控制器,但我无法想出返回他们到控制器。
如何将myService
的非承诺响应与我的控制器变量同步?或者我应该将$q.all
承诺返回给控制器,然后让控制器调用statusService
?
理想情况下,我希望控制器只是“发射并忘记”并等待状态响应,以便我可以更新模态。
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);
}
任何帮助都将不胜感激。
答案 0 :(得分:1)
在AngularJS中,异步服务应该是return的承诺。要转换服务中的promise数据,请确保将转换后的数据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。
答案 1 :(得分:0)
您可以通过
等服务进行回调 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
});
}