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 ответа:
Выражение ...
`.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 на этом этапе, чтобы включить текущего пользователя и запрошенного друга. Таким образом, они оба имеют к нему доступ.