我是承诺概念的新手,至少在创造它们时。我已经阅读了文档如何工作,并了解了 承诺的工作原理。我也理解如何在所有承诺完成时触发一些回调,我只是不知道如何在我的代码中实现它。
我的代码简化了:
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()
任何人都可以解释如何做到这一点吗?
答案 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(){
// ...
});