Javascript promise 链接

标签 javascript parse-platform promise

我正在为移动应用程序使用 Parse Cloud 函数,但它们都遵循异步性质。因此,为了克服这种性质,我开始使用 javascript Promises。 但 promise 也没有给我想要的输出。

问题是:second-thenthird-then之后执行。在third-then中,getRecommendedGroupgroups的参数正在获取[]

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

基本上groups2nd 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);
        }
    });
};

最佳答案

第二个 then 正在运行,但它正在调用异步函数。为了正确排序,必须履行循环启动的那些 promise 。幸运的是,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
});

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

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

关于Javascript promise 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29577256/

相关文章:

javascript - Jquery setInterval 和 clearInterval

ios - 对象没有方法 'Status' iOS SDK和解析云代码

javascript - 在 node.js 中返回一个延迟的嵌套 promise

node.js - Node/Mongo 内置 Promise

javascript - promise 与 Q 的序列组合

php - JavaScript 与 PHP : The same calculation returns different result

javascript - 更好的写法(jQuery)

javascript - 如何从 Angular Controller 将指令插入到 View 中?

android - 自定义列解析查询

ios - 解析,如何通过 PFRelation 进行查找