2014-01-21 3 views
1

Я немного смущен тем, где разместить response.success() при использовании серийных обещаний.Последовательные обещания и ответ. Успех в облачном коде

В ситуации: У меня есть облачная функция, которая принимает массив адресов электронной почты и текущего пользователя. Эта функция выполняет следующие функции:

  • Находит текущего пользователя на основе идентификатора объекта пользователя.
  • перебирает массив электронных адресов
  • Найти, если есть существующий пользователь для каждого конкретного адреса электронной почты
  • Если существующий пользователь, мы проверяем, если существующий пользователь и текущий пользователь друзья
  • Если они не друзья, это создает дружбу.

Теперь, когда я запускаю эту функцию без response.success(), он делает именно то, что я ожидаю его и дружеские записи создаются. Но независимо от того, где я размещаю ответ в коде, я получаю сообщение response.success и ни одно из сериализованных обещаний не выполняется.

Почему результирующий успех/сбой имеет значение: я выполняю эту функцию из приложения iOS, и я хотел бы правильно обрабатывать случаи успеха или сбоя правильно на стороне iOS.

Вот функция облака:

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"); 
    }); 
}); 

Заранее спасибо. Дайте мне знать, если есть что-то еще, что я могу добавить.

+0

Это не совсем фрагмент кода. Попробуйте передать параметр вашим методам '' then (function (data) {console.log (data.success)}) '', чтобы вы могли передать значение обещания –

ответ

0

Ваш .then функция обратного вызова, связанная с promise, должна вернуть обещание. Отсутствие этого является распространенной ошибкой при использовании обещаний.

Кроме того, Parse, похоже, не показывает объекты с console.log в качестве браузеров, поэтому я заверну их в JSON.stringify().

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