在解析云代码中使用自己的promise

Use own promises in Parse cloud code

本文关键字:自己的 promise 代码      更新时间:2023-09-26

我想保存一个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);
    });    
}