2015-08-18 1 views
2

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

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

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) 

Спасибо заранее за любая помощь, которую любой может предложить.

+0

То, что вы указали, не поможет решить проблему, так как ошибка находится глубоко в источнике Parse.js. 'apply()' - это метод объекта Function. Вы можете передавать объект, где вы должны передавать функцию. – Blindman67

ответ

1

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

`.then(deleteFriendRequest(friendRequestId))` 

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

Однако .then() принимает функции как свои аргументы, не обещает.

Try:

.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); 
}); 
+0

Спасибо, это очень помогло мне с моим пониманием. Ваше последнее предложение «Going далее ...», похоже, лучше всего подходит для работы, но я все равно получаю «успех/ошибка не вызывается», когда все работает, поэтому мне не хватает «response.success». Где было бы наиболее уместно здесь поставить это? –

+0

Хорошая точка, 'response.success' не вызывается. В предпоследней строке ответ «null» сдвигает.error' на второе место списка параметров .then(). «null» должно быть действительно заменено на функцию. В простейшем случае это может быть «response.success». Чтобы действительно служить сообщение успеха вам нужно что-то вроде \t '.then (функция() { \t \t response.success ("мой успех сообщение"); \t}, response.error);' \t Сообщите мне, если это сработает, и я отредактирую свой ответ. –

+1

Замена 'null' на' response.success' служит моим потребностям. Большое спасибо за Вашу помощь!! –

0

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

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

+0

'createFriendship' работает в том, что создает требуемое отношение и удаляет запрос друга, но я получаю эту ошибку, поэтому мой клиент Android получает исключение и считает, что функция не удалась. Похоже, что он не имеет доступа к доступу, поскольку он делает то, что он должен делать в этом отношении. Мысли? –

Смежные вопросы