CloudCode обещает последовательно, вспомогательная функция выдает ошибку "объект не имеет метода 'apply'"


Я новичок в JavaScript, и я пытаюсь заставить мои первые биты CloudCode работать. Я создал вспомогательную функцию deleteFriendRequest, поскольку я хочу, чтобы она использовалась другими функциями. То, что я написал, работает, но я получаю ошибку.

Моя вспомогательная функция:

function deleteFriendRequest(requestObjectId) {
    // create query to find FriendRequest from its objectId
    var requestQuery = new Parse.Query("FriendRequest");
    requestQuery.equalTo("objectId", requestObjectId);
    return requestQuery.first().then(function(friendRequestObj) {
        return friendRequestObj.destroy();
    });

}

Функция, в которой она используется:

Parse.Cloud.define("createFriendship", function(request, response) {
    Parse.Cloud.useMasterKey();

    var currentUser = request.user;
    var friendRequestId = request.params.friendRequestObjectId;

    var fromUser;
    var fromRelation;

    var requestQuery = new Parse.Query("FriendRequest");
    requestQuery.equalTo("objectId", friendRequestId);
    requestQuery.include("fromUser");
    requestQuery.first().then(function(friendRequestObj) {
            fromUser = friendRequestObj.get("fromUser");
            fromRelation = currentUser.relation("friendsRelation");
            fromRelation.add(fromUser);
            return currentUser.save();
        }).then(function(friendRequestObj) {
            var toRelation = fromUser.relation("friendsRelation");
            toRelation.add(currentUser);
            return fromUser.save();
        }).then(deleteFriendRequest(friendRequestId))
        .then(function(error) {
            response.error(error);
        });

});

При запуске createFriendship я получаю следующую ошибку:

Input: {"friendRequestObjectId":"qVIa9zzPR0"}
Result: TypeError: Object [object Object] has no method 'apply'
    at e (Parse.js:2:8941)
    at Parse.js:2:8390
    at Array.forEach (native)
    at Object.x.each.x.forEach [as _arrayEach] (Parse.js:1:661)
    at c.extend.resolve (Parse.js:2:8341)
    at Parse.js:2:9020
    at e (Parse.js:2:8941)
    at Parse.js:2:8390
    at Array.forEach (native)
    at Object.x.each.x.forEach [as _arrayEach] (Parse.js:1:661)
Заранее Благодарю за любую помощь, которую кто-либо может предложить.
2 2

2 ответа:

Выражение ...

`.then(deleteFriendRequest(friendRequestId))` 

... немедленно вызывает deleteFriendRequest(friendRequestId) и передает возвращенное обещание .then().

Однако

Принимает функции в качестве аргументов, а не обещаний.

Попробуйте :

.then(function() {
    deleteFriendRequest(friendRequestId);
})

Или

.then(deleteFriendRequest.bind(null, friendRequestId))

Идем дальше ...

Большая часть того, что находится в deleteFriendRequest(), является производной friendRequestObj, которая является повторением работы, уже выполненной в вызывающей функции, поэтому, если deleteFriendRequest() не требуется в другом месте приложения, строка return friendRequestObj.destroy(); может быть перемещена в вызывающий, и deleteFriendRequest() может исчезнуть.

Parse.Cloud.define("createFriendship", function(request, response) {
    Parse.Cloud.useMasterKey();
    var requestQuery = new Parse.Query("FriendRequest");
    requestQuery.equalTo("objectId", request.params.friendRequestObjectId);
    requestQuery.include("fromUser");
    requestQuery.first()
    .then(function(friendRequestObj) {
        var fromUser = friendRequestObj.get("fromUser");
        request.user.relation("friendsRelation").add(fromUser);
        fromUser.relation("friendsRelation").add(request.user);

        // The two saves can most likely be performed in parallel
        return Parse.Promise.when(
            request.user.save(), 
            fromUser.save()
        )
        .then(function() {
            return friendRequestObj.destroy(); //<<<<<<<< moved here from deleteFriendRequest()
        });
    })
    .then(response.success, response.error);
});

Попробуйте использовать Parse.Cloud.useMasterKey(); в методе deleteFriendRequest. Похоже, что текущий пользователь может не иметь доступа к этой строке.

Другим вариантом может быть попытка установить ACL при создании запроса на добавление в друзья. Вы должны будете использовать мастер-ключ снова, но вы можете установить ACL на этом этапе, чтобы включить текущего пользователя и запрошенного друга. Таким образом, они оба имеют к нему доступ.