1

コード 141 エラーの成功/エラーが呼び出されませんでした。{result: [result1, result2]} のような JSON を返す別の関数 getCinemasInLocation を実行しています。この配列を繰り返し処理し、ループが実行されるたびにクエリを実行し、すべての結果を配列に返したいと考えています。つまり、すべての演算の結果が配列になります。私はそれを正しくやっていますか?

//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;
}
4

1 に答える 1

1
  1. Parse.Cloud.run は配列を返しません。Promise を返します。したがって、同じファイルに通常の JavaScript 関数を作成します: getCinemasInLocation()

  2. @Delhi が言ったように、response.success() または response.error() は 1 回しか呼び出せません。したがって、それらをループに入れないでください。

  3. Promise を並行して使用します。ということで、通常のFORループの代わりにアンダースコアのループを使いましょう。一度に複数の操作を開始し、Parse.Promise.when を使用して、すべての入力 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); } ); });
于 2014-08-30T11:13:37.633 に答える