解析云代码:承诺中的逻辑分支

时间:2015-11-06 17:25:45

标签: javascript parse-platform cloud-code

我正在尝试编写Parse.com Cloud Code函数来完成以下工作流程:

  1. 用户提交值。
  2. 云代码功能会检查该值是否与code类型的任何对象匹配。
  3. 如果没有,该函数返回“未找到”值。
  4. 如果是,则假定类型为code的对象具有指向item类型对象的指针。
  5. 然后,检查code.item以查看它是否有指向alert类型对象的指针。
  6. 如果不是,则该函数返回“未找到”值。
  7. 如果code.item.alert 确实存在,那么我想获取完整的alert对象,包括可能存在或不存在的指针,最多可达2层。
  8. 当我开始编写此函数的代码时,我可以让它工作到检查是否存在code,如果存在,是否也存在code.item.alert

    这就是出现问题的地方。就目前而言,在我的函数的工作版本中,返回的alert项只是类类型和objectId。我理解为什么会这样,我正在尝试编写代码来在返回之前填充对象,但是我没有尝试。

    这是迄今为止工作的代码(但仅返回alert对象的shell):

    Parse.Cloud.define("alertLookup", function (request, response) {
        Parse.Cloud.useMasterKey(); 
    
        var codeQuery       = new Parse.Query("code");  
        codeQuery.equalTo("value", request.params.code);
        codeQuery.include("item");
    
        codeQuery.find().then(function (codes) {
            if (codes.length === 0) {
                response.success("no item");
            } else {
                var code    = codes[0];
                var item    = code.get("item");
                var alert   = item.get("alert");
                if (alert === null || alert === undefined) {
                    response.success("no item");
                } else {
                    response.success(alert);
                }
            }       
        }, function (error) {
            response.error(error);
        });
    });
    

    以下是我尝试失败的错误代码为141:

    Parse.Cloud.define("alertLookup", function (request, response) {
        Parse.Cloud.useMasterKey(); 
    
        var codeQuery       = new Parse.Query("code");  
        codeQuery.equalTo("value", request.params.code);
        codeQuery.include("item");
    
        codeQuery.find().then(function (codes) {
            if (codes.length === 0) {
                response.success("no item");
            } else {
                var code    = codes[0];
                var item    = code.get("item");
                var alert   = item.get("alert");
                if (alert === null || alert === undefined) {
                    response.success("no item");
                } else {
                    return alert.fetch();                   
                }
            }       
        }).then(function (a) {
            response.success(a);
    
        }, function (error) {
            response.error(error);
        });
    });
    

    为什么fetch()来电无法正常工作?当我插入console.log()语句时,虽然alert非空,但似乎永远不会调用return alert.fetch();。至少,response.success(a);行永远不会被调用。为什么不呢?

1 个答案:

答案 0 :(得分:0)

在链接Promise时尝试这个:

codeQuery.find().then(function (codes) {
    if (codes.length != 0) {
        var code    = codes[0];
        var item    = code.get("item");
        var alert   = item.get("alert");
        if (alert != null && alert != undefined) {
            var alertObj = new Parse.Object("alert"); // alert class ???
            alertObj.id = alert.id;
            return alertObj.fetch();                   
        }
    }
    // return a Promise for no items
    return Parse.Promise.as("no item");

}).then(function (a) {
    response.success(a);

}, function (error) {
    response.error(error);
});