Javascript承诺混乱

时间:2015-11-11 17:25:03

标签: javascript parse-platform promise

我正试图用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);

2 个答案:

答案 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中读到这有时会导致错误。我忘记了具体案例,但这不是其中之一。但随意将样式编辑回您喜欢的样式。