Parse: Попытка множественного запроса в функции кода Parse Cloud. Второй запрос не работает

Я пытаюсь запустить несколько запросов внутри облачной функции Parse. Второй запрос не выполняется

Parse.Cloud.beforeSave ("Номера телефонов", функция (запрос, ответ) {

// Check if the same phone number for the same user exists
var PhoneNumbersObject = Parse.Object.extend('PhoneNumbers');

var duplicationQuery = new Parse.Query(PhoneNumbersObject);
duplicationQuery.equalTo('user', Parse.User.current());
duplicationQuery.equalTo('phoneNumber', request.object.get("phoneNumber"));

duplicationQuery.count({
    success: function(count) {
        if (count > 0) {
            response.error("This number is already stored");
        }
    },
    error: function(error) {
        response.error("Error " + error.code + " : " + error.message + " when storing phone number");
    }
});

var firstPhoneNumberQuery = new Parse.Query(PhoneNumbersObject);
firstPhoneNumberQuery.equalTo('user', Parse.User.current());

firstPhoneNumberQuery.find({                           //  <<<<< find doesn't work
    success: function(results) {
        if ( results.length == 0 ) {
            console.log("User's first telephone number");     // <<< Never reaches here
            request.object.set("primary", true);
        } else {
            console.log("Hello");                      // <<< Never reaches here
        }
    },
    error: function(error) {
        console.log("Bye");
        response.error("Query failed. Error = " + error.message);
    }
});

response.success();

});


person Deborshi Saha    schedule 09.08.2014    source источник


Ответы (1)


Проблема в том, что запросы асинхронны. Вы не ждете завершения запроса перед вызовом response.success().

Думайте о своем вызове firstPhoneNumberQuery.find() как о том, как варить яйца, блоки success и error — это то, что вы будете делать, когда это будет сделано.

Вызов response.success() похож на сообщение уборщикам, что вы закончили, и они могут выбросить все, что еще «готовится».

Используйте обещания, чтобы избежать этой проблемы, а также переместите вызов response.success() внутрь обработчика success вашего запроса:

duplicationQuery.count({
    // ... success / error as above
}).then(function() {
    var firstPhoneNumberQuery = new Parse.Query(PhoneNumbersObject);
    firstPhoneNumberQuery.equalTo('user', Parse.User.current());
    // return the promise so we can keep chaining
    return firstPhoneNumberQuery.find();
}).then(function(results) {
    // ... success for find
    // then call success() here
    response.success();
}, function(error) {
    // ... error block for find
});

Как видите, вы можете комбинировать столько блоков then(), сколько вам нужно.

Узнайте больше о обещаниях и цепочках здесь:

https://parse.com/docs/js_guide#promises

person Timothy Walters    schedule 11.08.2014