如何处理嵌套的承诺?

时间:2016-12-01 10:52:40

标签: javascript angularjs ionic-framework promise angular-promise

我是承诺概念的新手,至少在创造它们时。我已经阅读了文档如何工作,并了解了 承诺的工作原理。我也理解如何在所有承诺完成时触发一些回调,我只是不知道如何在我的代码中实现它。

我的代码简化了:

function start_it_all(){
    return $cordovaSQLite.execute(db, "SELECT foo FROM bar").then(function(result) {
        return anotherFunction();
    });
}
function anotherFunction(){
     return $http.get('foo.php').then(function(){
        // Here I get some data
     });
 }

$cordovaSQLite$http都是异步的。我需要能够做到这一点:

start_it_all().then(function(){
   // Hide Loading animation (no further return data needed).
});

我理解.then()是承诺处理程序,但正如我目前所拥有的那样,它只返回查询的承诺,我希望$http给出承诺。此时我在TypeError: Cannot read property 'then' of undefined

上获得start_it_all().then()

任何人都可以解释如何做到这一点吗?

2 个答案:

答案 0 :(得分:3)

您不必nest这些承诺,您可以执行以下操作:

function start_it_all(){
    return $cordovaSQLite.execute(db, "SELECT foo FROM bar")
    .then(function(result) {
        return $http.get('foo.php');
    })
    .then(function(){
            // Here I get some data
    });
}

根据原始问题中的评论,$cordovaSQLite.execute的.then方法似乎不符合Promise / A +

要解决此问题,请在$cordovaSQLite.execute(...)

中换Promise.resolve
function start_it_all(){
    return Promise.resolve($cordovaSQLite.execute(db, "SELECT foo FROM bar"))
    .then(function(result) {
        return $http.get('foo.php');
    })
    .then(function(){
            // Here I get some data
    });
}

现在,基于评论和编辑的问题

function start_it_all(){
    return Promise.resolve($cordovaSQLite.execute(db, "SELECT foo FROM bar"))
    .then(anotherFunction)
    .then(function(){
            // Here I get some data
    });
}
  

正如@LenilsondeCastro所指出的那样 - 你可以使用我$q.when

以上的Promise.resolve

答案 1 :(得分:1)

确保在链的每个级别返回承诺,并以最深层次返回数据。所以写:

    return $http.get('foo.php').then(function(){
        // Here I get some data
        return data;
    });

编辑:上述内容是在您修改问题并添加return

之前编写的

然后在主调用中,你可能想要访问数据,所以添加参数:

start_it_all().then(function(data){
   // Hide Loading animation.
});

错误处理

在评论中,您表示您收到了execute承诺,...这可能表示发生了阻止HTTP请求的错误。

为确保您没有运行未检测到的错误条件,请同时添加错误处理程序:

function start_it_all(){
    return $cordovaSQLite.execute(db, "SELECT foo FROM bar").then(function(result) {
        return anotherFunction();
    }, function(err) {
        console.log('error in SQL query', err);
    });
}
function anotherFunction(){
     return $http.get('foo.php').then(function(){
        // Here I get some data
        return data;
     }, function(err){
        console.log('error occurred in HTTP request', err);
     });
 }

start_it_all().then(function(){
    // ...
});