我有以下结构,需要简化它,
Resuable service1与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 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.all的内容,但请注意这不适用于这种情况。
答案 0 :(得分:5)
确切地说,承诺的美妙之处在于你可以链接它们而不是像回调一样嵌套它们。在处理上一个时,你可以返回另一个承诺:
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
});
最后,您处理可能发生的错误。
答案 1 :(得分:5)
你可以链接多个这样的承诺:
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
});
检查交互式演示,了解成功和错误数据如何传递到链中的下一个承诺,以及如何完全控制每个步骤的进程:
答案 2 :(得分:0)
承诺的一个真正伟大的事情是它们可以像这样被链接:
function1 (){
return service1.isDbExist.then(function(exists){
if(!exists) return service1.createDB()
})
.then(function() {
return service1.getData('some', 'args')
});
}
请记住,.then
将收到上一个函数的结果,就像exists是布尔值一样。 function1
也会返回一个承诺,此承诺将从service1.getData
返回已解决/拒绝的承诺。