【问题标题】:Get Data from parse.com Promises从 parse.com Promises 获取数据
【发布时间】: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,并且在我可以取回所有数据之前发生了表刷新

标签: parse-platform promise


【解决方案1】:

promise 概念有一些不正确的用法。我将通过它们,但首先是最终代码:

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()",它已经是一个promise,你可以将它push到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);
        }
      });
    }
  );
}

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

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

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

希望这会有所帮助。

【讨论】:

  • 感谢您提供详细信息。我运行了代码并在控制台中运行了 console.dir(allJobDataArray);和 console.log(allJobDataArray[0]);它只返回一个包含两个用户项的数组。我可以看到它从 console.log(employeeNameArray); 打印数组在此之前,但在决赛中,它就像只让员工做一份工作。 Job 查询返回的不是全部 12 Array[2] ParseUser {_objCount: 44, className: "_User", id: "uHWPYwuedW"} 我如何才能将返回的值作为一个工作对象数组,其属性是该工作的员工姓名数组?
  • 如果我为 getEmployeeName 运行第二个函数,它仍然只返回一个包含两名员工的数组,但这次是他们的真实姓名Array[2] 0: "Actual Employee Name 1"1: "Actual Employee Name 2"length: 2__proto__: Array[0] wt'
  • 所以“getEmployeeName”被多次调用并打印所有作业?
  • 我搞定了。再次感谢你的帮助。我在原始问题中发布了更新的代码。
猜你喜欢
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
相关资源
最近更新 更多