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
);
我试图理解 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
);