我正在为移动应用程序使用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-then
在3rd-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);
}
});
};
答案 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);
}