处理 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成为一个对象,这是我查询的结果。

promisescallback 关键字让我很困惑。

我已经尝试了几种方法来解决我的问题,但是当我调用(在我的控制器中)时:

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 对象很棒,因为您可以继续使用 .thens 进行链接,并且仍然保持错误处理和最终行为清晰。这使您可以创建在 javascript.

的疯狂世界中有序的简单流程