Javascript 在Angularjs中链接多个承诺
我有以下结构,需要简化它 可恢复服务1与IndexedDB交互Javascript 在Angularjs中链接多个承诺,javascript,angularjs,Javascript,Angularjs,我有以下结构,需要简化它 可恢复服务1与IndexedDB交互 function isDbExist (){ // do something , it return either reject or resolve } function createDB (){ // do something , it return either reject or resolve } function getData (){ // do something , it return either r
function isDbExist (){
// do something , it return either reject or resolve
}
function createDB (){
// do something , it return either reject or resolve
}
function getData (){
// do something , it return either reject or resolve
}
在另一个service2中,我注入了这个service1并使用了相应的函数
function1 (){
service1.isDbExist.then(function(data){
service1.createDB.then(function(data){
service1.getData.then(function(data){
referred.resolve(data);
},function(error){
deferred.reject(error)
})
},function(error){
deferred.reject(error);
})
},function(error){
deferred.reject(error);
})
}
这里的问题是代码的可读性不好,不容易调试,因为哪个拒绝函数适用于哪个承诺。他们这样做有什么好方法吗?我读过关于$q的文章,但这不适用于这种情况。确切地说,承诺的美妙之处在于你可以将它们链接起来,而不是像回调一样嵌套它们。在处理前一个问题时,您可以返回另一个承诺,例如:
isDbExists().then(function(db) {
// do something
return createDb();
}).then(function(db) {
// do something with with the resolved db..
return getData();
}).then(function(data) {
// Do something with data
}).catch(function(error) {
// Uh oh, something went wrong. Deal with error
});
最后,您将处理可能发生的错误。您可以像这样链接多个承诺:
service1.isDbExist()
.then(service1.createDB)
.then(service1.getData)
.then(function() {
// DB exists, created and data loaded
})
.catch(function(err) {
console.log('Handle error', err); // isDbExist, createDB or getData rejected
});
查看交互式演示,了解成功和错误数据如何传递给链中的下一个承诺,以及您如何完全控制每个步骤的过程:
演示:承诺最伟大的一点是,它们可以像这样被链接起来:
function1 (){
return service1.isDbExist.then(function(exists){
if(!exists) return service1.createDB()
})
.then(function() {
return service1.getData('some', 'args')
});
}
请记住,
。然后
将接收上一个函数的结果,就像exists将是布尔值一样function1
还将返回一个承诺,此承诺将从service1.getData
返回已解析/拒绝的承诺。如果isDBExist正在解析中传递某个内容,我将如何在.then(service1.createDB)中获得该值?我编写的内容相当于service1.isDBExist()。then(函数(数据){return service1.createDB(data);}).then(function(data){return service1.getData(data);})
这样您就不必担心将数据传递到链中的下一个。是的,刚刚完成,正在尝试。谢谢。很快就会更新您。感谢这个示例,我现在有几个问题,1.如果isDbExist()正在以解析方式传递一些需要传递给service1.createDB(“从isDBExist传递某些内容”),如何执行此操作?2.catch块仅显示第一个承诺中的错误,如何从其他承诺中获取错误数据?我在下面回答了您的第一个问题。至于错误,.catch()当三个承诺中的任何一个被拒绝时将被调用。您能解释一下为什么要使用return吗?在then()中返回一个承诺
允许您以这种方式链接承诺,因为他只是传递返回承诺的函数。两种方法都是有效的,因为刚刚实现此解决方案,又出现了一个问题。如果其中一个承诺失败,我需要调用异步函数,在该承诺成功后,我需要继续正常执行。如果不清楚,我可以拉小提琴