Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Angularjs中链接多个承诺_Javascript_Angularjs - Fatal编程技术网

Javascript 在Angularjs中链接多个承诺

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

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

可恢复服务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 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()中返回一个承诺
允许您以这种方式链接承诺,因为他只是传递返回承诺的函数。两种方法都是有效的,因为刚刚实现此解决方案,又出现了一个问题。如果其中一个承诺失败,我需要调用异步函数,在该承诺成功后,我需要继续正常执行。如果不清楚,我可以拉小提琴