【问题标题】:Code 141 success/error message not called on parse cloud code nested query解析云代码嵌套查询时未调用代码 141 成功/错误消息
【发布时间】:2014-08-29 08:43:12
【问题描述】:

我不断收到代码 141 错误成功/未调用错误。我正在运行另一个函数 getCinemasInLocation,它返回如下 JSON:{result: [result1, result2]}。我想遍历这个数组并在每次循环运行时运行一个查询,并将所有结果放到一个数组中。也就是说,所有迭代的结果都将放在一个数组中。我做得对吗?

//This function uses getCinemasInLocation to retrieve the movie objects that are showing in the cinemas
Parse.Cloud.define("getMovieIdsInCinemas", function(request, response) {
    var cinemasInLocaton = [];
    var theLocation = request.params.theLocation;
    cinemasInLocation = Parse.Cloud.run("getCinemasInLocation", {theLocation: theLocation});
    for (i = 0; i < cinemasInLocation.length; i++){
        var query = new Parse.Query("showing");
        var movieIds = [];
        query.equalTo("cinema", {
            __type: "Pointer",
            className: "Cinema",
            objectId: cinemasInLocation[i]
        });
        query.find({
            success: function(results) {
                for (var i = 0; i < results.length; i++) {
                    movieIds.push(results[i].get("movie"));
                }

            response.success(movieIds);
            },
            error: function() {
                response.error("movie lookup failed 2");
            }
        });
    }
});

这是不起作用的 getCinemasInLocation

function getCinemasInLocation(theLocation) {
// some code
//var result = ["xiUXXYFhAl","Yanh9iDykk"];
//return result;

   var result = new Parse.Promise();
   var query = new Parse.Query("Cinema");
   query.equalTo("Location", theLocation);

    query.find({
        success: function(objects) {
            var cinemas = [];
            for (var i = 0; i < objects.length; i++) {
                var cinema = objects[i];
                cinemas.push(cinema.id);
            }
            result.resolve(cinemas);
        },
        error: function(error) {
            result.reject(error);
        }
    });

return result;
}

【问题讨论】:

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


    【解决方案1】:
    1. Parse.Cloud.run 不返回数组。它返回一个承诺。因此,在同一个文件中创建一个普通的 javascript 函数:getCinemasInLocation()

    2. 正如@Delhi 所说,您只能调用 response.success() 或 response.error() 一次。所以,不要把它们放在一个循环中。

    3. 并行使用 Promise。所以,让我们使用下划线循环而不是普通的 FOR 循环。您可以一次启动多个操作,并使用 Parse.Promise.when 创建一个新的 Promise,该 Promise 将在其所有输入 Promise 都被解决时被解决。您可以在文档中阅读更多相关信息:https://www.parse.com/docs/js_guide#promises-parallel

    var _ = require('underscore');
    
    function getCinemasInLocation(theLocation) {
        // some code
        var result = [id1, id2];
        return result;
    }
    // This function returns the array of movieIds of a cinema
    function getMovieIdsInCinema(cinemaId) {
        var result = new Parse.Promise();
        var query = new Parse.Query("showing");
        query.equalTo("cinema", {
            __type: "Pointer",
            className: "Cinema",
            objectId: cinemaId
        });
        query.find({
            success: function(objects) {
                var movieIds = [];
                for (var i = 0; i < objects.length; i++) {
                    var movie = objects[i].get("movie");
                    movieIds.push(movie.id);
                }
                result.resolve(movieIds);
            },
            error: function(error) {
                result.reject(error);
            }
        });
        return result;
    }
    Parse.Cloud.define("getMovieIdsInCinemas", function(request, response) {
        var cinemasInLocation = [];
        var theLocation = request.params.theLocation;
        cinemasInLocation = getCinemasInLocation(theLocation);
    
        var promises = [];
        _.each(cinemasInLocation, function(cinemaId) {
            promises.push(getMovieIdsInCinema(cinemaId));
        });
    
        Parse.Promise.when(promises).then(
            function() {
                var result = [];
                _.each(arguments, function(object) {
                    result.push(object); // each object is an array of movieIds
                });
                response.success(result); // return array of arrays
            },
            function(error) {
                response.error(error);
            }
        );
    });
    

    【讨论】:

    • 非常感谢。它工作得很好。我编辑了 getCinemasinLocation 函数以从数据库中检索电影院,然后它返回一个空数组。我将在上面发布编辑。我在这样做时复制了 getMovieIdsInCinema(),但它仍然不起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 2016-05-04
    • 2016-08-21
    相关资源
    最近更新 更多