2015-05-21 3 views
1

Я создаю новую функцию CloudCode в синтаксическом анализе, чтобы получить общее количество пользователей в базе данных. Мне удалось добиться этого, делая это:Использование объектов Parse в частной функции CloudCode

Parse.Cloud.define("getUsers", function(request, response) { 
    var users = Parse.Object.extend("_User"); 
    var query = new Parse.Query(users); 

    query.find({ 
     success: function(numberOfUsers) { 
     response.success(numberOfUsers.length); 
    }, 
    error: function(error) { 
     alert("Error: " + error.code + " " + error.message); 
    } 
}); 
}); 

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

Parse.Cloud.define("signUp", function(request, response) { 
    var user = new Parse.User(); 
    user.set("username", request.params.username); 
    user.set("password", request.params.password); 

    //setting empty fields 
    ... 
    user.set("alias", "user#" + numberOfUsers()); 

    user.signUp(null, { 
    success: function(user) { 
     response.success(user); 
    }, 
    error: function(user, error) { 
     alert("Error: " + error.code + " " + error.message); 
    } 
}); 
}); 

function numberOfUsers() { 
    var users = Parse.Object.extend("_User"); 
    var query = new Parse.Query(users); 

    query.find({ 
     success: function(numberOfUsers) { 
     return numberOfUsers.length; 
    }, 
    error: function(error) { 
     return 0; 
    } 
}); 
} 

, но это не работает для некоторых причина. Функция numberOfUsers() возвращает пустую. Я вижу, что у некоторых других есть проблемы с использованием объектов синтаксического анализа в частных функциях, я нашел тот же вопрос на панели управления без ответа ... https://parse.com/questions/how-to-define-helper-method-in-cloud-code Кто-нибудь знает, как этого достичь? Спасибо!

ответ

2

Проблема заключается в том, что query.find работает асинхронно, поэтому немедленно возвращается, даже если запрос еще не закончен. Также имейте в виду, что максимальный предел, который вы можете задать для запроса, - 1000 объектов.

Итак, как только ваша пользовательская база вырастет выше этого числа, вам придется перечислить результаты, которые могут принимать n количество времени. Что может стать проблемой позже в будущем, поскольку функции Cloud Code ограничены работой в течение 15 секунд макс.

Вместо подсчета ваших пользователей каждый раз, когда вы можете отслеживать количество пользователей, увеличивая столбец счетчика при каждом создании пользователя и уменьшая его, как только объект пользователя будет удален.

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

Теперь вам нужно обойти проблему синхронизации/асинхронности, здесь вы можете использовать JavaScript Promises, чтобы связать различные операции и убедиться, что они запускаются в серии.

+1

Советник о максимальном количестве объектов в запросе очень полезен, я буду отслеживать количество пользователей так, как вы предлагаете! Спасибо, что объяснили, как работают запросы! –