JavaScript 承诺

JavaScript Promises

我试图理解 promises,但我遇到了障碍,我正在尝试查询我的 Parse 数据库以获取最后一个 运行 日期对象,以便我知道最后一个 运行 是什么时候。然后将该日期传递给下一个函数,该函数可以在上次调用后检查我的电影数据库中的任何内容。 (我这样做是为了发送手动输入到 Parse class 中的新字段的推送通知)然后实际发送推送。但我不理解 .then 和 promises,我是 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() returns 一个 Promise 对象,您可以将其与 then 链接起来,它本身是一个以 2 个函数作为参数的函数:一个在 promise 为已解决,如果承诺被拒绝,则调用该方法。您使用这些代替成功和错误参数:

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

您作为参数传递给 then 的函数本身可以 return 承诺,您随后可以将其与 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()
    });

以此类推

我建议您查看 Promises/A+ 规范 - 它非常有指导意义。

编辑:

如果链接概念有点混乱,请将其视为以下内容的 shorthand:

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