Javascript带来混乱
我正试图用Parse来解释承诺 我想做的是获取大量作业,然后对每个作业执行更新Javascript带来混乱,javascript,parse-platform,promise,Javascript,Parse Platform,Promise,我正试图用Parse来解释承诺 我想做的是获取大量作业,然后对每个作业执行更新 var queryJobs = new Parse.Query("Jobs"); queryJobs.find().then(function (results) { // Loop thorugh all jobs for (var i = 0; i < results.length; i++) { var job = results[i]; // Here
var queryJobs = new Parse.Query("Jobs");
queryJobs.find().then(function (results) {
// Loop thorugh all jobs
for (var i = 0; i < results.length; i++) {
var job = results[i];
// Here. I want to run an update on all object and then continue.
}
return ????;
}).then(function () {
status.success("Finish");
}, function () {
status.error("Error");
});
您必须将承诺添加到承诺
,而不是函数。您需要调用函数,以便它返回承诺:
promises.push((function () {
// ...
}()));
// ^^
此外,还必须删除promise.resolve()代码>在返回
语句之前调用。只有在查询成功后才能解析承诺。按照目前的情况,承诺会立即得到解决。您必须将承诺添加到承诺中,而不是函数中。您需要调用函数,以便它返回承诺:
promises.push((function () {
// ...
}()));
// ^^
此外,还必须删除promise.resolve()代码>在返回
语句之前调用。只有在查询成功后才能解析承诺。按照目前的情况,承诺会立即得到解决。以下是我如何设置的:
var failure = new Parse.Promise();
var success = new Parse.Promise();
var queryJobs = new Parse.Query("Jobs");
queryJobs.each
(
function( job )
{
//Do your changes to the job
return job.save().then
(
function( job )
{
return Parse.Promise.as( "job saved" );
},
function( error )
{
failure.reject("There was an error trying to save a job: " + error.message);
return failure;
}
);
}
).then
(
function( results )
{
success.resolve("Successfully updated all the jobs" )
return success;
},
function( error )
{
failure.reject("There was an error trying to query for Jobs: " + error.message);
return failure;
}
).then
(
function( success )
{
response.success( success );
},
function( failure )
{
response.error( failiure );
}
);
这可能不是开箱即用的,但它有几个关键特性可以帮助您
1) 我知道在博客文章中提到的一个好处是,你可以摆脱金字塔码,但如果你想要描述性的错误信息,金字塔码是一个必要的邪恶。我的第一个承诺(queryJobs.each在本例中)总是有两个。然后()。第二个总是只做response.error(失败)和response.success(成功)
2) 我创建了两个承诺,尽管您可以只使用一个。我更喜欢两个,这样就可以清楚地知道我在哪里失败/成功了。当我到达终点/终点线时,我返回这些
3) 我使用了query.each
而不是query.find
。query.find()被限制为1000个结果,这在很长一段时间内可能已经足够了,但最终会导致您达到极限,您需要开始对结果分页。使用query.each将对查询可能返回的每个对象执行您的函数。query.each
vsquery.find
和迭代结果的一个优点是query.each
异步地对每个对象执行回调,而不是线性迭代
4) 在这种情况下,最好在每个块中都有return job.save(),但我想展示一下如何执行嵌套的promise返回。这使我能够有非常具体的成功/错误声明。这很重要,因为即使承诺链中的一个链接失败,您也会继续执行下一个链接。例外情况是,如果承诺被拒绝,并且直到最后一个链才有错误函数。错误将从一个链接传递到另一个链接,直到它找到一个错误函数,这很好,但它限制了您可以自定义错误消息的数量
我还将注意到,对于该query.first()方法,您可能会一次又一次地返回相同的对象,而不是使用第一个查询中的特定作业。比如,你在重复你的工作,但是你不是在每个工作上做任何事情,而是在得到第一份工作,然后一次又一次地用它做一些事情。我不认为这是你真正想要的,但也许这是一个“学习承诺”的帖子,而不是一些功能性的东西
不管怎样,希望我能帮点忙。如果你有问题,请告诉我,我会尽力回答
编辑:我知道我的风格与其他人有很大不同。大多数情况下,我喜欢在新行上打开和关闭括号。实际上,我在javascript中读到,这有时会导致错误。我忘记了具体的案例,但这不是其中之一。但请随意编辑样式,使其恢复到您喜欢的样式 下面是我将如何设置它:
var failure = new Parse.Promise();
var success = new Parse.Promise();
var queryJobs = new Parse.Query("Jobs");
queryJobs.each
(
function( job )
{
//Do your changes to the job
return job.save().then
(
function( job )
{
return Parse.Promise.as( "job saved" );
},
function( error )
{
failure.reject("There was an error trying to save a job: " + error.message);
return failure;
}
);
}
).then
(
function( results )
{
success.resolve("Successfully updated all the jobs" )
return success;
},
function( error )
{
failure.reject("There was an error trying to query for Jobs: " + error.message);
return failure;
}
).then
(
function( success )
{
response.success( success );
},
function( failure )
{
response.error( failiure );
}
);
这可能不是开箱即用的,但它有几个关键特性可以帮助您
1) 我知道在博客文章中提到的一个好处是,你可以摆脱金字塔码,但如果你想要描述性的错误信息,金字塔码是一个必要的邪恶。我的第一个承诺(queryJobs.each在本例中)总是有两个。然后()。第二个总是只做response.error(失败)和response.success(成功)
2) 我创建了两个承诺,尽管您可以只使用一个。我更喜欢两个,这样就可以清楚地知道我在哪里失败/成功了。当我到达终点/终点线时,我返回这些
3) 我使用了query.each
而不是query.find
。query.find()被限制为1000个结果,这在很长一段时间内可能已经足够了,但最终会导致您达到极限,您需要开始对结果分页。使用query.each将对查询可能返回的每个对象执行您的函数。query.each
vsquery.find
和迭代结果的一个优点是query.each
异步地对每个对象执行回调,而不是线性迭代
4) 在这种情况下,最好在每个块中都有return job.save(),但我想展示一下如何执行嵌套的promise返回。这使我能够有非常具体的成功/错误声明。这很重要,因为即使承诺链中的一个链接失败,您也会继续执行下一个链接。例外情况是,如果承诺被拒绝,并且直到最后一个链才有错误函数。错误将从一个链接传递到另一个链接,直到它找到一个错误函数,这很好,但它限制了您可以自定义错误消息的数量
我还将注意到,对于该query.first()方法,您可能会一次又一次地返回相同的对象,而不是使用第一个查询中的特定作业。比如,你在重复你的工作,但不是对每个工作做任何事情,而是得到第一份工作,然后去做