【发布时间】:2016-01-27 08:13:40
【问题描述】:
我正在尝试使用 parse.com promises 来检索工作数据以及与工作相关的用户关系数据。我有一个返回承诺但不返回工作数据的函数。如何从返回的 promise 中获取工作和员工信息?
逻辑上我想:
1) 查询解析以获取作业数组
2) 对于每个职位,再次查询 Parse 以获取员工关系信息
3) 创建包含工作和员工详细信息的本地对象
4) 将每个作业对象添加到本地数组
5) 从 Parse 检索到所有信息后,加载带有对象数组的表
我可以执行步骤 1-4,但我不知道如何等到从 Parse 检索到所有信息以刷新本地表。
function getJobPromises (){
var promises = [];
var Job = Parse.Object.extend("Job");
var query = new Parse.Query(Job);
query.equalTo("company", company);
query.notEqualTo("isDeleted", true);
query.limit(1000); // raise limit to max amount
query.find().then(function(results) {
// Create a trivial resolved promise as a base case.
var promise = Parse.Promise.as();
_.each(results, function(result) {
// For each item, extend the promise with a function to add it to the job array
promise = promise.then(function() {
// Return a promise that will be resolved when the job details have been added to the array
var object = result;
promises.push(getEmployeeName(object));
allJobDataArray = promises;
});
});
return Parse.Promise.when(promises);
}).then(function() {
// Every job has been retrieved
console.log("All items have been returned. Refresh table...");
console.log(allJobDataArray);
});
}
执行关系查询以获取与作业关联的用户的函数
function getEmployeeName(jobObject) {
var employeeNameArray = [];
//Query to get array of employees for the passed in job
var rQuery = jobObject.relation("employee");
return rQuery.query().find({
success: function(employees){
//Get employees full name for each job
for (var i = 0; i < employees.length; i++) {
var objEmployee = employees[i];
var fullName = objEmployee.get("fullName");
employeeNameArray.push(fullName);
console.log(employeeNameArray);
}
},
error: function(error){
response.error(error);
}
});
}
更新 感谢@eduardo
,它现在可以正常工作了我有一个公共数组来保存作业对象。
var jobObjectsArray = [];
在 getEmployeeName 函数中,我正在创建工作对象并将它们添加到该数组中
function getJobPromises (){
var promises = [];
var Job = Parse.Object.extend("Job");
var query = new Parse.Query(Job);
query.equalTo("company", company);
query.notEqualTo("isDeleted", true);
query.limit(1000); // raise limit to max amount
query.find().then(function(results) {
_.each(results, function(result) {
promises.push(getEmployeeName(result));
});
return Parse.Promise.when(promises);
}).then(function(allJobDataArray) {
// allJobDataArray should be actually an Array of Array
console.log(jobObjectsArray);
refreshTable();
});
}
function getEmployeeName(jobObject) {
var employeeNameArray = [];
//Query to get array of employees for the passed in job
var rQuery = jobObject.relation("employee");
return new Promise(
function(resolve, reject) {
rQuery.query().find({
success: function(employees){
//Get employees full name for each job
for (var i = 0; i < employees.length; i++) {
var objEmployee = employees[i];
var fullName = objEmployee.get("fullName");
employeeNameArray.push(fullName);
var objAllJobs = new Object();
objAllJobs["jobId"] = jobObject.id;
objAllJobs["location"] = jobObject.get("location");
objAllJobs["startTime"] = jobObject.get("startTime");
objAllJobs["employee"] = employeeNameArray;
jobObjectsArray.push(objAllJobs);
}
console.log(employeeNameArray);
resolve(employeeNameArray);
},
error: function(error){
reject(error);
}
});
}
);
【问题讨论】:
-
你在调用
Parse.Promise.when(promises);,而promise还没有被添加到数组中。 -
您以某种方式将顺序迭代与并行映射混合在一起。你要哪个?
-
最终目标是在我获得每项工作的工作信息和员工信息之前,不调用最后一个 then 函数。我正在尝试使用作业详细信息创建一个对象并将其加载到表中。以前我没有使用 Promise,并且在我可以取回所有数据之前发生了表刷新