JavaScript Promises

JavaScript Promises

本文关键字:Promises JavaScript      更新时间:2023-09-26

我试图理解承诺,但我遇到了障碍,我正在尝试查询我的 Parse 数据库以获取上次运行的日期对象,以便不知道它上次运行的时间。然后将该日期传递给下一个函数,该函数可以在上次调用电影后检查我的电影数据库以获取任何内容。(我这样做是为了为手动输入到 Parse 类中的新字段发送推送通知(然后实际发送推送。但我不明白 .then 和承诺,我是 JavaScript 的新手,所以任何帮助将不胜感激!

这是我现在拥有的代码。

Parse.Cloud.job("TestSendNewMoviePush", function(request, response) {
    var query = new Parse.Query("MovieStatus");
    var lastRunDateQuery = new Parse.Query("LastRun");
    var lastRunDate;
    var newDate;
    var newCount = 0;
    var installQuery = new Parse.Query(Parse.Installation);
    query.greaterThan("updatedAt", lastRunDate);
    query.equalTo("CurrentStatus", "Ready");
    query.equalTo("imageStatusName", "Green");
    installQuery.equalTo("role", "downloader");
    lastRunDateQuery.get("d3WeNEwzIu", {
    success: function(lastDateRanObj) {
    console.log("Got the object " + lastDateRanObj);
    var date = new lastDateRanObj.updatedAt;
    lastRunDate = lastDateRanObj.updatedAt;
    console.log(lastRunDate);
    return lastRunDate;
    },
    error: function(lastDateRanObj, error) {
    console.log("Failed to get object");
  }
}).then(
  query.count({
    success: function(count) {
      newCount = count;
      return newCount
    }, 
    error: function(e) {
    }
  })).then(
  Parse.Push.send({
        where: installQuery,
        data: { 
  "alert": newCount + " new movie(s) available!",
  "badge": "Increment"
}
    }, {
    success: function() {
      response.success("Success");
    },
    error: function(e) {
      response.error("Error:" + e.code);
    }
    }));
});

lastRunDateQuery.get()返回一个 Promise 对象,您可以将其与 then 链接,该对象本身是一个将 2 个函数作为参数的函数:一个在解决承诺时调用,另一个在承诺被拒绝时调用。您可以使用这些参数而不是成功和错误参数:

lastRunDateQuery.get()
    .then(function(data) {
       // success!!
    }, function(error) {
       // error :(
    });

作为参数传递给then的函数本身可以返回 promise,随后您可以使用 then 链接这些 .在下面的示例中,我省略了错误回调:

lastRunDateQuery.get()
    .then(function(data) {
       // data is the result of lastRunDateQuery.get()
       return query.count();
    })
    .then(function(data) {
       // data is the result of query.count()
       return someOtherThing.someOtherMethodReturningAPromise();
    });
    .then(function(data) {
      // data is the result of someOtherThing.someOtherMethodReturningAPromise()
    });

等等。

我建议看看承诺/A +规范 - 它非常有启发性。

编辑:

如果链接概念有点令人困惑,只需将其视为以下内容的简写:

var aPromise = lastRunDateQuery.get();
aPromise.then(
    function() {}, // promise was resolved -> call this function
    function() {}, // promise was rejected -> call this function
);