Mat*_*nsc 1 javascript promise parse-platform parse-cloud-code
我正在尝试清理我的 Parse Cloud Code 函数以使其更易于维护。为此,我尝试使用 Promises,但无法消除错误。
这是我的代码的目的:
Parse.Cloud.useMasterKey();
var action = request.object.get("action");
var from = request.object.get("from");
var to = request.object.get("to");
var reward = request.object.get("reward");
// Query 'from User' to decrement his score
var queryScore = new Parse.Query(Parse.User);
queryScore.get(from.id, {
success: function(score)
{
// Decrement score of 'fromUser'.
var newScore = score.get("score");
newScore -= reward;
score.set("score", newScore);
score.save(null, {
success: function(success)
{
// Score was saved.
// Find devices associated with 'to User'
var queryTo = new Parse.Query(Parse.User);
queryTo.equalTo("objectId", to.id);
var pushQueryTo = new Parse.Query(Parse.Installation);
pushQueryTo.matchesQuery("user", queryTo);
pushQueryTo.first({
success: function(installation)
{
// Device found
// Fetch 'from User' infos
from.fetch({
success: function(User) {
// 'from User' fetched
// Send Push to 'to User'
var first_name = User.get("first_name");
var preferredLanguages = installation.get("preferredLanguages");
var alert = ""
switch (preferredLanguages) {
case "fr":
alert = first_name + " vous demande de : " + action
break;
default:
alert = first_name + " is asking you to : " + action
}
Parse.Push.send({
where: pushQueryTo,
data: {
"alert": alert,
"badge": "Increment",
"content-available": "1",
"type": "actionAsked",
"sound": "default"
}
});
// Everything is done!
response.success();
},
error: function(error) {
// An error occurred.
response.error(error);
}
});
},
error: function(error)
{
// An error occurred.
response.error(error);
}
});
},
error: function(error)
{
// An error occurred.
response.error(error);
}
});
},
error: function(error)
{
// An error occurred.
response.error(error);
}
});
Run Code Online (Sandbox Code Playgroud)
Parse.Cloud.useMasterKey();
var action = request.object.get("action");
var from = request.object.get("from");
var to = request.object.get("to");
var reward = request.object.get("reward");
// Query 'from User' to decrement his score
var queryScore = new Parse.Query(Parse.User);
queryScore.get(from.id).then(function(score) {
// Decrement score of 'fromUser'.
var newScore = score.get("score");
newScore -= reward;
score.set("score", newScore);
return score.save();
}).then(function(result) {
// Score was saved.
// Find devices associated with 'to User'
var queryTo = new Parse.Query(Parse.User);
queryTo.equalTo("objectId", to.id);
var pushQueryTo = new Parse.Query(Parse.Installation);
pushQueryTo.matchesQuery("user", queryTo);
return pushQueryTo.first();
}).then(function(device) {
// Device found
// Fetch 'from User' infos
return from.fetch();
}).then(function(from){
// 'from User' fetched
// Send Push to 'to User'
var first_name = from.get("first_name");
var preferredLanguages = device.get("preferredLanguages");
var alert = ""
switch (preferredLanguages) {
case "fr":
alert = first_name + " vous demande de : " + action
break;
default:
alert = first_name + " is asking you to : " + action
}
Parse.Push.send({
where: pushQueryTo,
data: {
"alert": alert,
"badge": "Increment",
"content-available": "1",
"type": "actionAsked",
"sound": "default"
}
});
// Everything is done!
response.success();
},function(error) {
// An error occurred.
response.error(error);
});
Run Code Online (Sandbox Code Playgroud)
显然我的错误与“设备”变量有关。
在转换为承诺时,您也取消了嵌套,导致device并且pushQueryTo不再在以后的处理程序中。使用缩进良好的代码(如问题中所示),在源代码中很容易观察到像这样的范围问题。
幸运的是,无论在何处then()处理程序返回承诺,您都可以自由地直接链接到返回该承诺的表达式,而不是添加到最外层的承诺链。
此处的修复只是通过直接链接到pushQueryTo.first()和来重新引入一些嵌套from.fetch()。
Parse.Cloud.useMasterKey();
var action = request.object.get("action");
var from = request.object.get("from");
var to = request.object.get("to");
var reward = request.object.get("reward");
var queryScore = new Parse.Query(Parse.User);
queryScore.get(from.id)
.then(function(score) {
score.set('score', score.get('score') - reward);
return score.save();
})
.then(function(result) {
var queryTo = new Parse.Query(Parse.User);
queryTo.equalTo('objectId', to.id);
var pushQueryTo = new Parse.Query(Parse.Installation);
pushQueryTo.matchesQuery('user', queryTo);
return pushQueryTo.first()
.then(function(device) {
return from.fetch()
.then(function(from) {
var alert;
switch (device.get('preferredLanguages')) {
case 'fr': alert = from.get('first_name') + ' vous demande de : ' + action; break;
default: alert = from.get('first_name') + ' is asking you to : ' + action;
}
Parse.Push.send({
where: pushQueryTo,
data: { 'alert': alert, 'badge': 'Increment', 'content-available': '1', 'type': 'actionAsked', 'sound': 'default' }
});
response.success();
});
});
}).catch(function(error) {
response.error(error);
});
Run Code Online (Sandbox Code Playgroud)
请注意,我说这是“一个”解决方案,而不是“那个”解决方案。换言之,存在其他方法。在 .then() 链中访问先前承诺结果的整个主题在此处进行了非常全面的讨论。