处理 Ionic/Cordova 应用程序中的承诺
Handling a promise in a Ionic/Cordova Application
我目前正在开发一个 Ionic/Cordova
应用程序,一个待办事项应用程序。我正在使用 ngCordova
库来更轻松地使用 cordova 插件。我也在使用 litehelpers
(GitHub page) 的 Sqlite
插件。
我的问题是关于 JavaScript 的承诺行为的正确理解。我有一个名为 "Projects" 的 Angular 服务,它使用了 SQLite 插件,还有一个委托给它的 "Tasks" 控制器。
angular.module('myapp.services', [])
.factory("Projects", ["$ionicPlatform", "$cordovaSQLite", "$window", "$q",
function($ionicPlatform, $cordovaSQLite, $window, $q) {
return {
// SOME FUNCTIONS..
getCurrentProject: function() {
var q = $q.defer();
$ionicPlatform.ready(function() {
$cordovaSQLite.execute(db,
"SELECT id_project, name FROM projects WHERE active = 1").then(
function(res) {
q.resolve(res.rows.item(0));
}, function(err) {
q.reject(err);
console.error(err.message);
});
});
return q.promise;
}
};
}
]);
我想使这个函数return成为一个对象,这是我查询的结果。
promises
和 callback
关键字让我很困惑。
我已经尝试了几种方法来解决我的问题,但是当我调用(在我的控制器中)时:
var currentProject = Projects.getCurrentProject();
然后尝试检查其值:
console.log("ID -> " + currentProject.id_project);
console.log("NAME -> " + currentProject.name);
我总是 undefined
。如何在 Ionic/Cordova 应用程序中处理 promise
?
已解决
@bardzusny 的回答彻底让我意识到我哪里错了,谢谢大家:)
Promise 被设计为可与错误处理和最终行为(可选)链接在一起,如下所示:
Projects.getCurrentProject()
.then (project) -> currentProject = project
.catch (err) -> console.error err
.finally () -> wrapUpFn()
因此您需要使用 .then
来进行分配。否则,您会将 currentProject 分配给 promise 对象,而不是 promise 对象的结果(这是您想要的)。
编辑
现在 javascript:)
var currentProject
Projects.getCurrentProject()
.then(function(project) {
currentProject = project
})
.catch(function(err) {
console.error(err)
})
.finally(function() {
wrapUpFn()
})
顺便说一句,promise 对象很棒,因为您可以继续使用 .then
s 进行链接,并且仍然保持错误处理和最终行为清晰。这使您可以创建在 javascript.
的疯狂世界中有序的简单流程
我目前正在开发一个 Ionic/Cordova
应用程序,一个待办事项应用程序。我正在使用 ngCordova
库来更轻松地使用 cordova 插件。我也在使用 litehelpers
(GitHub page) 的 Sqlite
插件。
我的问题是关于 JavaScript 的承诺行为的正确理解。我有一个名为 "Projects" 的 Angular 服务,它使用了 SQLite 插件,还有一个委托给它的 "Tasks" 控制器。
angular.module('myapp.services', [])
.factory("Projects", ["$ionicPlatform", "$cordovaSQLite", "$window", "$q",
function($ionicPlatform, $cordovaSQLite, $window, $q) {
return {
// SOME FUNCTIONS..
getCurrentProject: function() {
var q = $q.defer();
$ionicPlatform.ready(function() {
$cordovaSQLite.execute(db,
"SELECT id_project, name FROM projects WHERE active = 1").then(
function(res) {
q.resolve(res.rows.item(0));
}, function(err) {
q.reject(err);
console.error(err.message);
});
});
return q.promise;
}
};
}
]);
我想使这个函数return成为一个对象,这是我查询的结果。
promises
和 callback
关键字让我很困惑。
我已经尝试了几种方法来解决我的问题,但是当我调用(在我的控制器中)时:
var currentProject = Projects.getCurrentProject();
然后尝试检查其值:
console.log("ID -> " + currentProject.id_project);
console.log("NAME -> " + currentProject.name);
我总是 undefined
。如何在 Ionic/Cordova 应用程序中处理 promise
?
已解决
@bardzusny 的回答彻底让我意识到我哪里错了,谢谢大家:)
Promise 被设计为可与错误处理和最终行为(可选)链接在一起,如下所示:
Projects.getCurrentProject()
.then (project) -> currentProject = project
.catch (err) -> console.error err
.finally () -> wrapUpFn()
因此您需要使用 .then
来进行分配。否则,您会将 currentProject 分配给 promise 对象,而不是 promise 对象的结果(这是您想要的)。
编辑
现在 javascript:)
var currentProject
Projects.getCurrentProject()
.then(function(project) {
currentProject = project
})
.catch(function(err) {
console.error(err)
})
.finally(function() {
wrapUpFn()
})
顺便说一句,promise 对象很棒,因为您可以继续使用 .then
s 进行链接,并且仍然保持错误处理和最终行为清晰。这使您可以创建在 javascript.