在解析云代码中使用自己的promise
Use own promises in Parse cloud code
我想保存一个registrationId,它是在Parse云代码中随机生成的,所以我需要检查这个值是否已经在DB中,我必须以递归的方式进行,直到我得到正确的字符串。以下是我迄今为止尝试的内容,问题是findRegistrationId()不是一个promise,所以我不能使用then()。有什么方法可以使它成为promise或任何其他变通方法吗?对于cloudcode
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);
});
});
您可以这样编写函数:
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;
}
@arghbleargh发布了一个很棒的解决方案,我只是发布了一种使用直接返回承诺而不是解决/拒绝的版本,这是一种反模式(请参阅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);
});
}
相关文章:
- 测试Angular Service解决错误回调中的promise
- 按我自己的类克隆另一个元素的内容和顺序
- 如何配置分析以将数据发送到我自己的服务器
- 如何使用jquery ajax和jsonp在您自己的域上读取json数据
- 创造自己的智能
- 如何在Win8Metro应用程序的Javascript代码中捕获自己的C#事件
- 从自己的安全系统中重新找回自己
- 嵌套的promise节点js
- 麻烦将coffee脚本片段移动到rails中自己的类中
- 为什么简单的Promise语句在浏览器中不起作用
- 从我自己的脚本中包含的Javascript文件中调用一个函数
- 让我自己的过滤器不工作
- 消隐数组元素是否生成自己的属性
- JavaScript子对象访问自己的值
- 函数参数在内部不可见,返回新的Promise(函数(resolve,reject).传递给被promise化的函数的
- Selenium异步脚本在自己的线程中阻塞其他脚本
- 为什么对象的函数值没有自己的作用域
- 使用+在节点中构造适当的promise
- 我怎样才能给数组中的每个对象赋予它们自己的键
- 在解析云代码中使用自己的promise