1
votes

I'm a little confused about where to place a response.success() when using serial Promises.

Here's the situation: I've got a cloud function that accepts an array of email addresses and the current user. The function does the following:

  • Finds the current user based upon it's user object id.
  • Iterates over the array of emails addresses
  • Find if there is an existing user for each given email address
  • If there is an existing user, we check to see if the existing user and the current user are friends
  • If they are not friends, it creates a friendship.

Now when I run this function without a response.success(), it does exactly what I expect it to and the friendships entries are created. But no matter where I place the response in the code, I get the resulting response.success message and none of the serialized promises execute.

Why the resulting success/failure matters: I'm executing this function from an iOS app and I'd like to properly handle the success or failure cases correctly on the iOS side.

Here is the cloud function:

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

    // Get our parameters
    var addresses = request.params.emailAddresses;
    var userId = request.params.user;

    // Query for our user
    var userQuery = new Parse.Query("User");
    userQuery.equalTo("objectId", userId)
    userQuery.first().then(function(currentUser) {

        // if we find the user, walk the addresses
        var promise = Parse.Promise.as("success");
        _.each(addresses, function(address) {

            console.log(address);

            // add a then to our promise to handle whether a relationship is
            // being created.
            promise = promise.then(function() {

                // find if there is a user for that address
                var emailQuery = new Parse.Query("User");
                emailQuery.equalTo("email", address);
                emailQuery.first().then(function(addressUser) {

                    if (typeof addressUser != 'undefined') {

                        // found one.
                        console.log(addressUser);

                        // figure out if our current user and this user are
                        // friends.
                        var friendQuery = new Parse.Query("FVFriendship");
                        friendQuery.equalTo("from", currentUser);
                        friendQuery.equalTo("to", addressUser);
                        friendQuery.first().then(function(relationship) {

                            if (typeof relationship != 'undefined') {

                                // if they are, we need to pass.
                                console.log("Found a relationship: " = relationship)

                            } else {

                                // They are not.  Add the friendship
                                var Friendship = Parse.Object.extend("FVFriendship");
                                var friendship = new Friendship();
                                friendship.set("from", currentUser);
                                friendship.set("to", addressUser);
                                friendship.save().then(function(result) {
                                    console.log("Created a friendship: " + result)
                                });
                            };
                        });

                    } else {

                        // we did not find a user for that address
                        console.log("No user for " + address);

                    };
                });                        
            });
        });

        console.log(promise);

        return promise;
    }).then(function() {
        response.success("success");
    });
});

Thanks in Advance. Let me know if there's anything else I can add.

1
This isn't exactly a code snippet. Try passing a parameter to your then methods then(function(data) { console.log(data.success) } ) so you can pass on the promise value - Elise Chant

1 Answers

0
votes

Your .then callback function attached to promise should return a promise. Missing this is a common mistake when using promises.

Also Parse doesn't seem to show objects with console.log as browsers do, so I wrap them into JSON.stringify().