Javascript带来混乱

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

我正试图用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. 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
vs
query.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
vs
query.find
和迭代结果的一个优点是
query.each
异步地对每个对象执行回调,而不是线性迭代

4) 在这种情况下,最好在每个块中都有return job.save(),但我想展示一下如何执行嵌套的promise返回。这使我能够有非常具体的成功/错误声明。这很重要,因为即使承诺链中的一个链接失败,您也会继续执行下一个链接。例外情况是,如果承诺被拒绝,并且直到最后一个链才有错误函数。错误将从一个链接传递到另一个链接,直到它找到一个错误函数,这很好,但它限制了您可以自定义错误消息的数量

我还将注意到,对于该query.first()方法,您可能会一次又一次地返回相同的对象,而不是使用第一个查询中的特定作业。比如,你在重复你的工作,但不是对每个工作做任何事情,而是得到第一份工作,然后去做