Использовать собственный promises в коде облачного кода
Я хотел бы сохранить registerId, который генерируется случайным образом в облачном коде Parse, поэтому мне нужно проверить, уже ли это значение в БД, я должен сделать это рекурсивным образом, пока не получу правильную строку. Вот что я пробовал до сих пор, проблема в том, что findRegistrationId() не является обещанием, поэтому я не могу использовать then(), есть ли способ сделать это обещанием или любым другим способом? для облачного кода
function getRandomString()
{
var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ";
var string_length = 4;
var randomstring = '';
for (var i=0; i<string_length; i++) {
var rnum = Math.floor(Math.random() * chars.length);
randomstring += chars.substring(rnum,rnum + 1);
}
return randomstring;
}
function findRegistrationId()
{
console.log("Enter findRegistrationId")
var randomString = getRandomString();
var query = new Parse.Query("Book");
query.equalTo("registrationId", randomString);
query.find.then(function(results){
if(results.length === 0)
{
console.log("no registrationId duplicated")
return randomString;
}
//if there is other registrationId we concatenate
else
{
console.log("registrationId duplicated let recursive it")
return findRegistrationId();
}
},function(error){
return error;
})
}
// Use Parse.Cloud.define to define as many cloud functions as you want.
// Gets the unique cool BC identificator. The real glue of BC!
Parse.Cloud.define("GetBookId", function(request, response) {
var promise = findRegistrationId();
promise.then(function(result){
console.log("success promise!!")
response.success(result);
}, function(error){
console.error("Promise Error: " + error.message);
response.error(error);
});
});
Ответы
Ответ 1
Вы можете написать свою функцию следующим образом:
function findRegistrationId()
{
console.log("Enter findRegistrationId")
var randomString = getRandomString();
var query = new Parse.Query("Book").equalTo("registrationId", randomString);
var promise = new Parse.Promise();
query.find().then(function(results) {
if (results.length == 0)
{
promise.resolve(randomString);
}
else
{
findRegistrationId().then(function(result) {
promise.resolve(result);
}, function(error) {
promise.reject(error);
});
}
}, function(error) {
promise.reject(error);
});
return promise;
}
Ответ 2
@arghbleargh опубликовано отличное решение, и я просто публикую версию, которая использует прямое возвращение promises, а не разрешение/отклонение, что является анти-шаблоном (см. https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns, например):
function findRegistrationId()
{
console.log("Enter findRegistrationId")
var randomString = getRandomString();
var query = new Parse.Query("Book").equalTo("registrationId", randomString);
return query.find().then(function(results) {
if (results.length == 0)
{
return randomString;
// or, you could return Parse.Promise.as(randomString);
// but the explicit promise isn't required
}
else
{
findRegistrationId().then(function(result) {
return result;
// or, you could return Parse.Promise.as(result);
// but the explicit promise isn't required
}, function(error) {
return Parse.Promise.error(error);
});
}
}, function(error) {
return Parse.Promise.error(error);
});
}