0

This is my code, and i always get "Success/error was not called" but i expected the end of my code waiting until ALL promises are resolved or rejected? Am i right?

SHORT Example how my code looks like (scroll a little bit more, for full code):

var promises = [];
for (var i = 0; i < 100; i++) {
    promises[i] = new Parse.Promise();
    if (i < 50) {
        someAsyncParseFunctions() {
            promises[i].resolve(i + "worked");
        }
    } else {
        someAsyncParseFunctions() {
            promises[i].reject(i + "doesnt work");
        }
    }
}
Parse.Promise.when(promises).then(function() {
    response.success("All worked");
}, function(err) {
    response.error(err.message);
});

Full code:

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

    var size = request.params.saveCardData.length;
    var currentUser = JSON.stringify(request.params.currentUser).slice(3, -3);
    var Card = Parse.Object.extend("Cards");
    var Relation = Parse.Object.extend("Relations");
    var promises = [];

    function count(fbName, pUrl, index) {
        var query = new Parse.Query(Card);
        var promise = new Parse.Promise();
        query.equalTo("Name", fbName);
        var c = query.count({
            success : function(count) {
                promise.resolve({
                    name : fbName,
                    pictureUrl : pUrl,
                    count : count,
                    index : index
                });
            },
            error : function(error) {
                promise.reject({
                    index : index,
                    error : error.message
                });
            }
        });
        return promise;
    };

    function savePicture(object) {
        var promise = new Parse.Promise();
        Parse.Cloud.httpRequest({
            url : object.pictureUrl,
            success : function(httpResponse) {
                var imageFile = new Parse.File(object.name.replace(" ", "_") + ".png", {
                    base64 : httpResponse.buffer.toString('base64', 0, httpResponse.buffer.length)
                });
                if ( typeof (imageFile) == "object") {
                    imageFile.save({
                        success : function(img) {
                            object.imageFile = img;
                            promise.resolve(object);
                        },
                        error : function(error) {
                            promise.reject({
                                index : object.index,
                                error : "error with creation of ImageFile"
                            });
                        }
                    });
                } else {
                    promise.reject({
                        index : object.index,
                        error : "error with creation of ImageFile"
                    });
                }
            },
            error : function(httpResponse) {
                //HttpResponse doesn't work
                promise.reject({
                    index : object.index,
                    error : httpResponse.status
                });
            }
        });
        return promise;
    };

    function saveCard(object) {
        var promise = new Parse.Promise();
        var newCard = new Card();
        newCard.set('Name', object.name);
        newCard.set('Image', object.imageFile);
        newCard.save(null, {
            success : function(newCard) {
                object.newCard = newCard;
                promise.resolve(object);
            },
            error : function(newCard, error) {
                promise.reject({
                    index : object.index,
                    error : error.message
                });
            }
        });
        return promise;
    };

    function saveRelation(object) {
        var promise = new Parse.Promise();
        var relation = new Relation();
        relation.set("cardID", object.name);
        relation.set("userID", currentUser);
        relation.set("Card", object.newCard.objectId);
        relation.save(null, {
            success : function(relation) {
                object.relation = relation;
                promise.resolve(object);
            },
            error : function(relation, error) {
                promise.reject({
                    index : object.index,
                    error : error.message
                });
            }
        });
        return promise;
    };

    function checkRelation(object) {
        var promise = new Parse.Promise();
        var query = new Parse.Query(Relation);
        query.equalTo('cardID', object.name);
        query.equalTo('userID', currentUser);
        query.find({
            success : function(rel) {
                if(typeof(rel.userID) == "undefined"){
                    object.relation = rel;
                    promise.resolve(object);
                }else{
                    promise.resolve({
                    index: object.index,
                    error : "Die Relation existiert schon"
                });
                }
            },
            error : function(error) {
                promise.resolve({
                    index: object.index,
                    error : error
                });
            }
        });
        return promise;
    };

    function getCardForRelation(object) {
        var promise = new Parse.Promise();
        var query = new Parse.Query(Card);
        query.equalTo("Name", object.name);
        query.find({
            success : function(card) {
                object.newCard = card;
                promise.resolve(object);
            },
            error : function(error) {
                promise.reject({
                    index : object.index,
                    error : error.message
                });
            }
        });
        return promise;
    };

    for (var i = 0; i < size; i++) {
        var params = request.params.saveCardData.pop();
        var pictureUrl = params.pop();
        var name = params.pop();
        promises[i] = new Parse.Promise();
        count(name, pictureUrl, i).then(function(object) {
            if ( typeof (object.name) == "string") {
                if (object.count == 0) {
                    //Card doesnt exists
                    savePicture(object).then(function(object) {
                        if ( typeof (object.name) == "string") {
                            //Bild erstellt
                            saveCard(object).then(function(object) {
                                if ( typeof (object.name) == "string") {
                                    //Image file and Card saved
                                    saveRelation(object).then(function(object) {
                                        if(typeof(object.name) == "string") {
                                            //Relation erstellt
                                            console.log(object.relation.get("cardID") + " erstellt! In Relation zu: " + object.relation.get("userID"));
                                            promises[object.index].resolve(object.relation.get("cardID") + " erstellt! In Relation zu: " + object.relation.get("userID"));
                                        }else {
                                            //Relation nicht erstellt
                                            promises[object.index].reject(object.error);
                                        }
                                    });
                                } else {
                                    //Image File and Card not created
                                    promises[object.index].reject(object.error);
                                }
                            });
                        } else {
                            //Fehler beim Bild erstellen
                            promises[object.index].reject(object.error);
                        }
                    });
                } else {
                    //Card already exists
                    checkRelation(object).then(function(object) {
                        if ( typeof (object.name) == "string") {
                            getCardForRelation(object).then(function(object) {
                                if ( typeof (object.name) == "string") {
                                    //Karte gefunden
                                    saveRelation(object).then(function(object) {
                                        if(typeof(object.name) == "string") {
                                            //Relation erstellt
                                            console.log(object.relation.get("cardID") + " erstellt! In Relation zu: " + object.relation.get("userID"));
                                            promises[object.index].resolve(object.relation.get("cardID") + " erstellt! In Relation zu: " + object.relation.get("userID"));
                                        }else {
                                            //Relation nicht erstellt
                                            promises[object.index].reject(object.error);
                                        }
                                    });
                                } else {
                                    //Karte nicht gefunden
                                    promises[object.index].reject(object.error);
                                }
                            });
                        } else {
                            promises[object.index].reject("Relation existiert doch schon!");
                        }
                    });
                }
            } else {
                promises[object.index].reject(object.error);
            }
        });
    }
    Parse.Promise.when(promises).then(function() {
        response.success("Worked fine");
    }, function(err) {
        response.error(err);
    });
});

Would be nice if some of you could help me fixing this! I realy tried much! Maybe it's only a small error from my side!

fr3ddyf
  • 73
  • 8
  • Try `return Parse.Promise.when(promises).then ...` first. – eth3lbert Dec 04 '14 at 10:41
  • Please don't dump a block of 200 lines of code into Stackoverflow, asking people to fix it. Nobody has time for that. If you can't state a problem in less than 30 lines of code, you have not thought about it enough. – Tomalak Dec 04 '14 at 10:42
  • @eth3lbert still getting the same error :/ – fr3ddyf Dec 04 '14 at 10:53
  • @Tomalak Guys who understand what my problem is can reduce this complex code to less then 4 lines. I think thats ok for everybody. But if you want to, i can do a short example for you too... Check my edit – fr3ddyf Dec 04 '14 at 10:54
  • 2
    Why don't *you* reduce your problem to 4 lines, then? I'm not only thinking of people who solve your problem, but also of people that arrive here through a web search and need to be able to understand the gist of it. Plus, it's simply inconsiderate to post 200 lines of code, of which only 10% are relevant in any way. You're saving time at the expense of everybody else. – Tomalak Dec 04 '14 at 11:05
  • That's a lot better! – Tomalak Dec 04 '14 at 11:13
  • Where in your code is that *"Success/error was not called"* message? – Bergi Dec 04 '14 at 17:25
  • Don't use the [deferred antipattern](http://stackoverflow.com/q/23803743/1048572). Not sure whether that is the reason for your problems, though. – Bergi Dec 04 '14 at 17:26
  • @Bergi the code is at the total end of the script. This deferred antipattern looks like my code :O I will check this out, if you could help me on this, it would be amazing, maybe some short example for my for() loop? – fr3ddyf Dec 04 '14 at 19:47

0 Answers0