我正试图用Parse找出Promises。
我想要做的是获得大量工作,然后为每项工作执行更新。
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");
});
我没试好就试过这个。永远不会执行推送块。
var queryJobs = new Parse.Query("Jobs");
queryJobs.find().then(function (results) {
var promises = [];
// Loop thorugh all jobs
for (var i = 0; i < results.length; i++) {
var job = results[i];
promises.push((function () {
// This is never executed.
var promise = new Parse.Promise();
var query = new Parse.Query("Jobs");
query.first({
success: function (object) {
// ... Do something here....
promise.resolve();
},
error: function () {
promise.resolve();
}
});
promise.resolve();
return promise;
}));
}
return Parse.Promise.when(promises);
}).then(function () {
status.success("Finish");
}, function () {
status.error("Error");
});
提前致谢
更新
我已经更改了代码,但是我进入了回调,但是,查询没有被执行。
...
promises.push((function () {
// GET HERE
var promise = new Parse.Promise();
var query = new Parse.Query("Jobs");
query.first({
success: function (object) {
console.log("CALLBACK");
promise.resolve();
},
error: function () {
console.log("CALLBACK");
promise.resolve();
}
});
}()));
return Parse.Promise.when(promises);
答案 0 :(得分:2)
您必须将承诺添加到promises
,而不是功能。您需要调用该函数,以便返回承诺:
promises.push((function () {
// ...
}()));
// ^^
此外,您必须在promise.resolve();
语句之前删除return
调用。只有在查询成功后才能解析承诺。目前,承诺立即得到解决。
答案 1 :(得分:2)
以下是我的设置方法:
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)总是有两个.then()&#39; s。第二个总是只做response.error(失败)和response.success(成功)。
2)我创造了两个承诺,虽然你只能使用一个。我更喜欢两个,所以我很清楚我在哪里失败/成功。我将这些返回到死胡同/终点线。
3)我使用query.each
代替query.find
。 query.find()限制为1000个结果,虽然它可能会长时间绰绰有余,但最终会使您达到极限,并且您需要开始对结果进行分页。使用query.each将对查询可能返回的每个对象执行您的函数。 query.each
vs query.find
的一个特权并且迭代结果是query.each
异步地对每个对象执行它的回调,而不是线性迭代。
4)在这种情况下,在每个块内部返回job.save()可能会更好,但我想展示如何进行嵌套的promise返回。这使我能够拥有非常具体的成功/错误陈述。这很重要,因为即使您的保证链中的一个链接失败,您仍将继续执行下一个链接。例外情况是,如果承诺被拒绝,并且您在最后一个链之前没有错误功能。错误将从链接传递到链接,直到找到错误函数,这很好,除了它限制了您可以自定义错误消息的数量。
我还会注意到,您所拥有的内容可能会一次又一次地为该query.first()方法返回相同的对象,而不是使用第一个查询中的特定作业。就像,你正在迭代你的工作,但不是每一份工作做任何事情,你都会得到第一份工作并一次又一次地做一些事情。我不认为这是你真正想要的东西,但也许这意味着要成为一个学习承诺&#34;发布而非功能性。
无论如何,希望我帮了一下。如果您有任何问题,请告诉我,我会尽力回答。
编辑:我知道我的风格与其他人的风格差异很大。在大多数情况下,我喜欢在新行上打开和关闭括号。我实际上在javascript中读到这有时会导致错误。我忘记了具体案例,但这不是其中之一。但随意将样式编辑回您喜欢的样式。