【问题标题】:Why does this Promise in Parse Cloud Code not work?为什么 Parse Cloud Code 中的这个 Promise 不起作用?
【发布时间】:2016-06-23 16:30:23
【问题描述】:

Parse Server 上的以下 Cloud Code 函数无法按预期工作。

它似乎解决得太早了,以至于并非所有promise2 的链式承诺都被执行。特别是我看到一些resultA.add(...); 没有被执行。

我已尝试重新安排几次,但均未成功。

我不确定return Parse.Promise.resolve(); 是否应该在else 子句中返回,或者它是其他内容还是什么都没有。

有人能在这里发现什么吗?

Parse.Cloud.define("aFunction", function(request, response) {

    var q = new Parse.Query("ClassA");    
    q.find()
    .then(
        function(resultsA) {

            var promise = new Parse.Promise.as();
            resultsA.forEach(function(resultA) {

                promise = promise
                .then(
                    function() {
                        var q = new Parse.Query("ClassB");
                        return q.first();
                    }
                )
                .then(
                    function(resultB) {

                        if (resultB != undefined) {
                            resultA.set(...);
                            return resultA.save();

                        } else {
                            resultA.set(...);
                            return resultA.save();
                        }
                    }
                )
                .then(
                    function() {

                        var q = new Parse.Query("ClassC");
                        return q.find()

                        .then(
                            function(resultsC) {
                                if (resultsC != undefined && resultsC.length > 0) {

                                    var promise2 = new Parse.Promise.as();
                                    resultsC.forEach(function(resultC) {
                                        promise2 = promise2
                                        .then(
                                            function() {
                                                resultA.add(...);
                                                return resultA.save();
                                            }
                                        );
                                    });
                                    return promise2;

                                } else {
                                    return Parse.Promise.resolve();
                                } 
                            }
                        );
                    }
                );
            });
            return promise;
        }
    )
    .then(
        function(result) {
            response.success("success");
        },
        function(error) {
            response.error(error.message);
        }
    );
});

代码很长,但我已经将其剥离并想展示实际的结构。谢谢。

【问题讨论】:

  • 是的,return undefinedreturn Promise.resolve(undefined)(效果相同)似乎合适。
  • 哦,等等,Parse API 是 return Parse.Promise.as(undefined),而不是 .resolve
  • @Bergi .as 方法似乎用于在承诺声明时预定义已解决承诺的返回值。要真正解决这个承诺,仍然需要调用.resolve。换句话说,Parse.Promise.as(aValue); Parse.Promie.resolve(); 等价于 Parse.Promise.resolve(aValue);
  • 天哪,Parse 术语太混乱了(它并不真正符合any standards)。我总是必须仔细检查the source 才能确定。他们的Promise.resolve(x)Promise.as(x) 方法的作用基本相同,只是resolve 按预期处理thenables,而as 只是满足值。在任何情况下,它们在与 undefined 一起使用时是可交换的,就像你的情况一样(你最好只使用其中一个以保持一致性)。

标签: javascript parse-platform promise parse-cloud-code


【解决方案1】:

刚刚检查了您的代码。 当您“清理代码”以显示结构时,我不确定这是否是您的类型错误。

在你的循环中:chats.forEach(function(resultA) ..

您似乎没有声明“聊天”变量。

另外,按照 Parse 官方的建议,请尝试以下操作:

var _ = require('underscore.js');

var promise = Parse.Promise.as();
_.each(resultsA, function(resultA) {

    promise = promise.then(function() {..}.then..then..
}
return promise;

希望对你有帮助。

【讨论】:

  • 谢谢,chats 是一个错字,代码已更正。我在其他功能中使用Parse.Promises,它们工作正常。我认为这是由于嵌套承诺的结构,它不起作用。
猜你喜欢
  • 2016-01-10
  • 2016-03-12
  • 1970-01-01
  • 2017-09-06
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
相关资源
最近更新 更多