我怎样才能用AngularJS写下承诺
我正在尝试编写一个服务,它执行多个异步请求,我使用$q返回一个承诺,问题是我正在编写一些重复的代码,我想消除重复我怎样才能用AngularJS写下承诺,angularjs,angularjs-service,q,Angularjs,Angularjs Service,Q,我正在尝试编写一个服务,它执行多个异步请求,我使用$q返回一个承诺,问题是我正在编写一些重复的代码,我想消除重复 app.factory('MyService',function($q){ var ser = { getA:function(){ var d= $q.defer; //repetitive code asyn1().then(function(){
app.factory('MyService',function($q){
var ser = {
getA:function(){
var d= $q.defer; //repetitive code
asyn1().then(function(){
aync2().then(function(res){
//Process data
doSomething(res)
d.resolve();
})
});
return d.promise
} ,
getB:function(){
var d= $q.defer;
asyn3().then(function(){
aync4().then(function(res){
//Process data
doSomething(res)
d.resolve();
})
});
return d.promise
}
}
return ser;
});
在每个函数中,我都在重复$q
这件事,如何避免重复 使用承诺链接:
getA: function() {
return asyn1().then(function(responseFromAsyn1) {
return aync2(responseFromAsyn1);
}).then(function(responseFromAsync2) {
return postProcess(responseFromAsync2);
});
}
getA()
现在比您原来的代码短得多,而且更正确:如果asyn1()
或async2()
失败,调用方实际上会得到一个被拒绝的承诺。承诺的思想是编写不增加右边缩进的代码,并且处理一个叫做“回调地狱”的东西
此代码
getA:function(){
var d= $q.defer; //repetitive code
asyn1().then(function(){
aync2().then(function(){
d.resolve();
})
});
return d.promise
}
可以这样重写吗
getA:function(){
return async1()
.then(async2)
.then(processTheResultOfAsync2);
}
或者,如果需要同步处理async1的结果
getA:function(){
return async1()
.then(function(result) {
..... soome synchronous processing
return async2(processed);
});
}
或者如果您需要async processinc
getA:function(){
return async1()
.then(function(result) {
return processAsync(result)
.then(async2);
});
}
承诺会让你的生活变得更简单,如果这没有发生,你就没有正确地使用它们
我的JSFIDLE页面上的演示:
我想在aync2之后,返回之前对数据进行一些预处理。所以我想我不能忽略$qYes,你可以,通过链接承诺。我会修改我的答案。我想在第二次全国青年大会之后,返回之前对数据进行一些预处理。所以我认为我不能忽略$qreturn async1().then(async2).then(procesAsync2Result);请在代码中提供解释。查看有关如何提供好答案的详细信息。
``var module = angular.module('app', []);
module.controller('appController', ['$scope', '$q', function($scope, $q) {
var fibonacci = [1, 1, 2, 3, 5, 8, 13, 20];
$scope.getItem = function(index) {
var promise = getItemPromise(index);
promise.then(
function(item) {
$scope.item = item;
$scope.error = "";
},
function(error) {
$scope.error = error;
$scope.item = null;
}
);
};
function getItemPromise(index) {
var item = fibonacci[index];
var deferred = $q.defer();
if (item)
deferred.resolve(item);
else
deferred.reject("L'item n'existe pas ou l'index n'est pas valide.");
return deferred.promise;
}
}]);