Search code examples
javascriptparse-platformpromisenested-loopsparse-cloud-code

Parse Cloud Code Error: Parse.Error {code: 141, message: "success/error was not called"}


I want to conditionally update several Parse.Objects using cloud code. The function is supposed to save select data to a new column should it apply to the User in question.

I'm having some serious issues with this in my first Cloud Code function. I think I have most of it right but I keep getting a success/error was not called error.

I'm using the following code:

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

var user = Parse.Object.extend("User");
var query = new Parse.Query(Parse.User);
var Table1 = Parse.Object.extend("Table1");
var table1Query = new Parse.Query(Table1);
var Table2 = Parse.Object.extend("Table2");
var table2Query = new Parse.Query(Table2);

var Ids = req.body //this is an array of Parse.Object Ids

var array = [];

var x = Ids.length

while (x--){
var Id = Ids[x];

table1Query.equalTo("user", {__type: "Pointer", className: "_User",                                                                              
                             objectId: Id});
table1Query.find({
success: function (results) {
         var resultIds = _.map(results, function (n) {
                           return n.id});

         var resultObjs = _.map(results, function (n) {
                           return return _.extend(_.find(n), {id: n.id})});

var a = resultIds.length
while (a--) {
var resultId = resultIds[a];

table2Query.equalTo("user", {__type: "Pointer", className: "_User",                                                                              
                             objectId: resultId});
table2Query.find({
success: function (items) {
var MA = _.map(_.flatten(items), function (n) {
return _.find(n)});

var step3 = _.map(resultObjs, function (n) {return _.extend(n, {
Matched: _.filter(MA, function (a) {return a.result.id == n.id})})});

var total = Math.round(_.reduce(_.map(step3, function (n) {return n.Bill
}), function (memo, num) {return memo + num;}, 0) * 100) / 100;

var duty = function (total, id) {
var promise = new Parse.Promise();
table2Query.get(id, {
success: function (Answer) {
Answer.set("duty", total);
Answer.save().then(function (difresult) {
response.success(difresult);
}, function (error) {
response.error(error);})
}
});
}
    array.push(duty(Answer, Id))
    }
})
}
}
})
}
return Parse.Promise.when(array);
})

Solution

  • I hope this is helpful to someone one day. The answer/difference in code is to be found at the very end as I added .then to put the response.success/error:

    Parse.Cloud.define("someFunction", function(request, response) {
    
    var user = Parse.Object.extend("User");
    var query = new Parse.Query(Parse.User);
    var Table1 = Parse.Object.extend("Table1");
    var table1Query = new Parse.Query(Table1);
    var Table2 = Parse.Object.extend("Table2");
    var table2Query = new Parse.Query(Table2);
    
    var Ids = req.body //this is an array of Parse.Object Ids
    
    var array = [];
    
    var x = Ids.length
    
    while (x--){
    var Id = Ids[x];
    
    table1Query.equalTo("user", {__type: "Pointer", className: "_User",                                                                              
                                 objectId: Id});
    table1Query.find({
    success: function (results) {
             var resultIds = _.map(results, function (n) {
                               return n.id});
    
             var resultObjs = _.map(results, function (n) {
                               return return _.extend(_.find(n), {id: n.id})});
    
    var a = resultIds.length
    while (a--) {
    var resultId = resultIds[a];
    
    table2Query.equalTo("user", {__type: "Pointer", className: "_User",                                                                              
                                 objectId: resultId});
    table2Query.find({
    success: function (items) {
    var MA = _.map(_.flatten(items), function (n) {
    return _.find(n)});
    
    var step3 = _.map(resultObjs, function (n) {return _.extend(n, {
    Matched: _.filter(MA, function (a) {return a.result.id == n.id})})});
    
    var total = Math.round(_.reduce(_.map(step3, function (n) {return n.Bill
    }), function (memo, num) {return memo + num;}, 0) * 100) / 100;
    
    var duty = function (total, id) {
    var promise = new Parse.Promise();
    table2Query.get(id, {
    success: function (Answer) {
    Answer.set("duty", total);
    Answer.save().then(function (difresult) {
    response.success(difresult);
    }, function (error) {
    response.error(error);})
    }
    });
    }
        array.push(duty(Answer, Id))
        }
    })
    }
    }
    })
    }
    return 
    
    Parse.Promise.when(array).then(function() {
        response.success("Successfully retrieved Total Bills.");
    },
        function(error) {
            response.error("Something is still wrong");
            console.log(error);
        });;
        })