JavaScript函数响应和链式承诺

时间:2016-01-22 17:07:52

标签: javascript parse-platform promise cloud-code before-save

我有Parse CloudCode beforeSave个功能,大致如下:

  • 运行查询以检查是否有正在保存的用户的重复用户;
  • 如果没有重复,我拨打response.success(),这意味着代码可以继续并允许保存新用户;
  • 但是,如果存在重复内容,我希望获取existing user,获取group对象并将existing user添加到group

为此,我使用链式承诺使代码更清晰。代码如下:

Parse.Cloud.beforeSave("Contact", function(request, response) {

    var facebookID = request.object.get("facebookID");
    var email = request.object.get("email");

    var queryFb;
    if (facebookID) {
        queryFb = new Parse.Query(Parse.User);
        queryFb.equalTo("facebookID", facebookID);
    }

    var queryEmail;
    if (email) {
        queryEmail = new Parse.Query(Parse.User);
        queryEmail.equalTo("email", email);
    }

    var query;
    if (facebookID && email) {
        query = new Parse.Query.or(queryFb, queryEmail);
    } else if (facebookID) {
        query = queryFb;
    } else {
        query = queryEmail;
    }

    var user;

    query.first().then(function(user) {

        if (!user) {

            response.success();

        } else {

            var groupQuery = new Parse.Query("Group");
            groupQuery.equalTo("title", "ssAll");
            groupQuery.equalTo("owner", request.user);
            return groupQuery.first();
        }

    }).then(function(group) {

        group.addUnique("contacts", user);
        return group.save();

    }).then(function(success) {

        response.error("NOT ERROR - new object was NOT created");

    }, function(error) {

        response.error(error);
    });
});

在我的测试用例中,查询返回!user,因此调用了response.success()消息 - 一切都很好。但是,这个响应似乎沿着promise链向下移动,这是针对查询返回user对象的情况。因此,我的函数在行group.addUnique("contacts", user);上以错误终止,因为group对象显然是undefined

如何解决此问题?

2 个答案:

答案 0 :(得分:1)

代码需要一些改进。关键的改进是为第二个promise的解决方案(第二个then块)提供一致的起始条件。在没有现有用户的情况下,OP代码调用response.success()。这很好,除了执行仍然落到下一个分辨率,在一个案例中有一个未定义的group参数。

新代码通过返回existingUser(在群组更新后)或null来修复此问题。 Null告诉下一个承诺解析调用success()并允许保存继续,否则阻止保存。

另请注意, 错误,第一个块的user参数与封闭范围中的var user冲突。我尝试使用下面的变量命名来突出显示代码认为的两种不同类型的用户......

Parse.Cloud.beforeSave("Contact", function(request, response) {
    var facebookID = request.object.get("facebookID");
    var email = request.object.get("email");
    // moved into a function so we can test and deal with it tersely
    findUserByEmailOrFB(email, facebookID).then(function(existingUser) {
        return (existingUser)? addContactToGroupOwnedBy(request.user, existingUser) : null;
    }).then(function(existingUser) {
        if (existingUser) {
            response.error("NOT ERROR - new object was NOT created");
        } else {
            response.success();
        }
    }, function(error) {
        response.error(error);
    });
});

// find the group owned by ownerUser, add contactUser to its contacts return a promise fulfilled as contactUser
function addContactToGroupOwnedBy(ownerUser, contactUser) {
    var groupQuery = new Parse.Query("Group");
    groupQuery.equalTo("title", "ssAll");
    groupQuery.equalTo("owner", ownerUser);
    return groupQuery.first().then(function(group) {
        group.addUnique("contacts", contactUser);
        return group.save().then(function() { return contactUser; });
    });
}

function findUserByEmailOrFB(email, facebookID) {
    var queryFb;
    if (facebookID) {
        queryFb = new Parse.Query(Parse.User);
        queryFb.equalTo("facebookID", facebookID);
    }
    var queryEmail;
    if (email) {
        queryEmail = new Parse.Query(Parse.User);
        queryEmail.equalTo("email", email);
    }
    var query;
    if (facebookID && email) {
        query = new Parse.Query.or(queryFb, queryEmail);
    } else if (facebookID) {
        query = queryFb;
    } else {
        query = queryEmail;
    }
    return query.first();
}

答案 1 :(得分:1)

问题在于,无论是否检查用户成功(尚未使用此用户),您始终都在解决第一个承诺。但是,实际上你不必解决这个承诺。我建议你把这样的错误案例分开:

query.first().then(function(user) {
    if (!user) {
        response.success();
    } else {
        addUserToGroup(request.user).then(function() {
            response.error("NOT ERROR - new object was NOT created");
        }, function(error) {
            response.error(error);
        });
    }
});

function addUserToGroup(user) {
    var groupQuery = new Parse.Query("Group");
    groupQuery.equalTo("title", "ssAll");
    groupQuery.equalTo("owner", user);
    return groupQuery.first().then(function(group) {
        group.addUnique("contacts", user);
       return group.save();
    });
}

正如您所看到的,第一个承诺无法解决,因为无论如何都不会使用结果。