从parse.com Promises获取数据

时间:2016-01-27 08:13:41

标签: parse-platform promise

我正在尝试使用parse.com promises来检索作业数据以及与作业相关的用户关系数据。我有一个函数返回promises但不返回作业数据。我如何得到这份工作&返回的承诺中的员工信息?

逻辑上我想:
1)查询Parse以获取作业数组
2)对于每个作业,再次查询Parse以获取员工关系信息
3)创建包含job&amp ;;的本地对象员工详细信息
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);
              }
            });
          }
        );

1 个答案:

答案 0 :(得分:0)

承诺概念有一些不正确的用法。我将介绍它们,但首先是最终代码:

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.dir(allJobDataArray);
    console.log(allJobDataArray[0]);
  });
}

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);
      return employeeNameArray;
    },
    error: function(error){
      response.error(error);
    }
  });
}

“Parse.Promise.as()”仅在您具有要作为承诺返回的值时使用。类似的东西:

Parse.Promise.as("my value").then(function(foo) {
  console.log(foo) // "my value"
});

因此,如果您的“getEmployeeName”函数返回一个promise,这意味着这个“rQuery.query()。find”会返回一个promise,您不必创建新的promise或使用“Parse.Promise”。 as()“,它已经是一个承诺,你可以把它推到promises数组。

另一个问题是你没有在“getEmployeeName”方法回调中返回任何内容。看看我的版本,我正在返回“employeeNameArray”。

只有当这个“rQuery.query()。find”方法返回一个promise时,我的版本才有效。如果不是这种情况,您可以使用如下回调创建新的承诺:

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);
          }
          console.log(employeeNameArray);
          resolve(employeeNameArray);
        },
        error: function(error){
          reject(error);
        }
      });
    }
  );
}

请注意这个“新Promise()”取决于Promise的浏览器支持,我不知道Parse是否具有等价物。无论如何,如果浏览器没有支持,你可以使用polyfill实现必要的代码。

有关标准承诺的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

Polyfill:https://github.com/jakearchibald/es6-promise/

希望这有帮助。