Javascript 在解析云代码时使用自己的承诺
我想保存一个registrationId,它是在解析云代码中随机生成的,因此我需要检查该值是否已经在DB中,我必须以递归的方式执行此操作,直到得到正确的字符串。这是我到目前为止所做的尝试,问题是findRegistrationId()不是承诺,所以我不能使用then(),有没有办法让它成为承诺或其他解决方法?对于cloudcodeJavascript 在解析云代码时使用自己的承诺,javascript,parse-platform,Javascript,Parse Platform,我想保存一个registrationId,它是在解析云代码中随机生成的,因此我需要检查该值是否已经在DB中,我必须以递归的方式执行此操作,直到得到正确的字符串。这是我到目前为止所做的尝试,问题是findRegistrationId()不是承诺,所以我不能使用then(),有没有办法让它成为承诺或其他解决方法?对于cloudcode function getRandomString() { var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ
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's 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);
});
});
函数getRandomString()
{
var chars=“0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ”;
变量字符串长度=4;
var randomstring='';
对于(var i=0;i您可以这样编写函数:
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;
}
@ArghLeargh发布了一个很好的解决方案,我只是发布了一个版本,使用直接返回承诺,而不是解决/拒绝,这是一种反模式(参见示例):
这是一个同步函数调用吗?难道你不能在回调中提供字符串并使其异步吗?而且,这仍然不能保证唯一性。你不会在你得到的字符串上创建任何类型的锁,因此可能会有人分配相同的ID。关于你试图解决的问题:你想要唯一的rEGISTITES ID,考虑一个原子运算,如增量(),当它返回时,它保证是唯一的。例如,如果你有一个带有NEXTID属性的记录,你可以调用记录。在save callback中,检查您得到了什么值,没有其他人可以得到该ID。如果您真的必须使用字母/数字,您可以创建一个确定性函数来将数字转换为可靠的序列。谢谢Timothy,我认为您是对的,但我将为@arghbleargh提供解决方案,因为他教会了我如何在Parse cl中做出承诺oud CODE这个答案教会了我承诺。+1请注意,这个答案使用了“延迟承诺返回”反模式;正确的方法是“返回query.find()…”,现在说promise.resolve/reject,而不是说“return Parse.promise.as/error”@BenjaminWheeler,你能发布一个包含你建议的所有更改的函数的替代版本吗?我有一个类似的函数,但是当我链接它时,我得到了“不能调用未定义在…的方法'then'”,当我只返回myFunction();在一个链接内部,但我不能返回myFunction()。then();知道为什么吗?@GregKrsak我希望没有。避免!谢谢。这个答案教会了我承诺。
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);
});
}