在Angularjs中链接多个承诺

时间:2015-07-12 09:32:23

标签: javascript angularjs

我有以下结构,需要简化它,

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的内容,但请注意这不适用于这种情况。

3 个答案:

答案 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
    });

检查交互式演示,了解成功和错误数据如何传递到链中的下一个承诺,以及如何完全控制每个步骤的进程:

演示http://plnkr.co/edit/PM06e8NGJvHKmoJ9C2Lf?p=info

答案 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返回已解决/拒绝的承诺。