Javascript承诺链接

时间:2015-04-11 11:17:02

标签: javascript parse-platform promise

我正在为移动应用程序使用Parse Cloud功能,但它们都遵循异步性质。因此,为了克服这种性质,我开始使用javascript Promises。 但承诺也没有给我所需的输出。

问题是:second-then在<{strong> third-then之后执行。在third-then中,getRecommendedGroup 群组的参数正在获得[]

getRecommendedGroup(request.params.email, groups, function(data){
    this is a callback
});

基本上群组2nd then的输出。

那么我应该如何编写代码以使2nd-then3rd-then之前执行。

以下是代码段

Parse.Cloud.define("getGroup", function(request, response) {
            var grpMember = new Parse.Query("GroupMember"),
                groupIds = [],
                groupObj = {};

            grpMember.equalTo("user", request.params.email);
            //from the groupMember we're taking groupId  
            grpMember.find()
                .then(function(grpMemberResponse) {
                    grpMemberResponse.forEach(function(value, index) {
                        var memberObj = value;
                        groupIds.push(memberObj.get("groupId").id);
                    });
                    return groupIds;
                })
                //with this groupId we're retriving group and pushing it to an groupArr
                .then(function(groupIds) {

                        var groupArr = [];
                        var promises = [];

                        groupIds.forEach(function(value, index) {
                                alert("GroupId :: " + value);
                                promises.push(findGroup(value, function(group) {
                                        groupArr.push(group);
                                    });
                                });
                            return Parse.Promise.when(promises);
                        })
                    .then(function(groups) {

                        alert("GroupArr :: " + JSON.stringify(groups));
                        getRecommendedGroup(request.params.email, groups, function(data) {

                            groupObj["own"] = groups;
                            groupObj["recommended"] = data;
                            response.success(groupObj);
                        });
                    });
                });

var findGroup = function(objectId, callback) {
    var groupQuery = new Parse.Query("Group");

    groupQuery.get(objectId, {
        success: function(group) {
            alert("Group Obj Id ::" + group.id);
            callback(group);
        },
        error: function(error) {
            alert("Error while finding Group " + error);
        }
    });
};

1 个答案:

答案 0 :(得分:2)

第二个然后运行第二个,但它正在调用异步函数。为了正确排序,必须满足循环启动的那些承诺。幸运的是,Promise.when()做到了......

.then(function(groupIds) {
    var findPromises = []
    groupIds.forEach(function(value, index) {
        findPromises.push(findGroup(value, function(group));
    )};
    return Parse.Promise.when(findPromises);
}).then() {
    // arguments is now a (var arg) array of results from running
    // all of the findPromises promises
});

编辑 - 为了使其正常工作,代码需要推送承诺来执行查找。这意味着findGroup必须返回一个承诺......

function findGroup(objectId) {
    var groupQuery = new Parse.Query("Group");
    return groupQuery.get(objectId);
}