Парсиране : Опитване на множество заявки във функция на кода на облака на анализатора. Второто запитване изглежда не работи

Опитвам се да изпълня множество заявки в облачната функция Parse. Втората заявка не се изпълнява

Parse.Cloud.beforeSave("PhoneNumbers", function(request, response) {

// 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