理解Parse中的JavaScript承诺

时间:2015-10-23 15:48:09

标签: javascript parse-platform

我正在Parse开发一个应用程序,我试图理解承诺。除了非常简单的例子之外,我没有找到很多工作示例:https://parse.com/docs/js/guide

我正在查询_User表。然后我在_.each循环中遍历用户。我在每次迭代中在循环内运行2个云函数。我在什么时候创造了承诺?我是否为循环中的每个云功能成功创建了一个?或者我将每个成功返回值推送到一个数组上,并将该值设置为循环外的promise值?我已经尝试了两种方法,但似乎无法找出正确的语法。

我会在伪代码中将其分解,因为这可能比实际代码更容易:

var query = new Parse.Query(Parse.User); query.find()。然后(功能(用户){

  • 循环遍历_.each循环中的每个用户,并为返回数字的每个用户运行云函数。
  • 如果数字> 0,然后我将他们的用户名推送到array1。
  • 然后我在用户(仍然在_.each循环中)运行第二个云函数,返回一个数字。
  • 如果数字> 0,然后我将他们的用户名推送到array2。

})。then(function(promisesArray){

//我想" promisesArray"要么是前一节中创建的2个数组,要么是它们的串联。

//最后,我需要一个用户名列表。具体而言,前一节中云功能具有正数值的用户

  • 连接2个数组,如果它们尚未连接
  • 删除重复项
  • 将推送通知发送给阵列中的用户 });

问题:   - 我在什么时候创建&回报承诺&我应该使用什么语法?   - 应该.then(function(promisesArray){be .when(function(promisesArray){(而不是那时)?

3 个答案:

答案 0 :(得分:1)

谢谢你们的想法!这是最终奏效的:

var query = new Parse.Query(Parse.User);
query.find().then(function(users){
  var allPromises = [];
  var promise1, promise2;

  _.each(users, function(user){
    if(user.get("myvalue") != "undefined" && user.get("myvalue") != ""){
      promise1 = Parse.Cloud.run("getBatch1", {param1: param1value, param2: param2value})
      .then(function(numResult){
        if(Number(numResult) > 0){
          return Parse.Promise.as(user.getUsername());
        }
      });
    }
    allPromises.push(promise1);

    if(user.get("anothervalue")==true){
      promise2 = Parse.Cloud.run("getBatch2", {param1: param1value, param2: param2value})
      .then(function(numResult2){
        if(Number(numResult2) > 0){
          return Parse.Promise.as(user.getUsername());
        }
      });
    }
    allPromises.push(promise2);
  });

  // Return when all promises have succeeded.
  return Parse.Promise.when(allPromises);

}).then(function(){
  var allPushes = [];
  _.each(arguments, function(pushUser){
    // Only add the user to the push array if it's a valid user & not already there.
    if(pushUser != null && allPushes.indexOf(pushUser) === -1){
      allPushes.push(pushUser);
    }      
  });

  // Send pushes to users who got new leads.
  if(allPushes.length > 0){
    Parse.Push.send({
      channels: allPushes,
      data: {
        alert: "You have new leads."
      }
    }, {
      success: function () {
        response.success("Leads updated and push notifications sent.");
      },
      error: function (error) {
        console.log(error);
        console.error(error);
        response.error(error.message);
      }
    });
  }
  response.success(JSON.stringify(allPushes));

}, // If the query was not successful, log the error
function(error){
  console.log(error);
  console.error(error);
  response.error(error.message);
});

答案 1 :(得分:0)

我不熟悉Parse API但是我这样做。当然,我无法测试我的代码,所以请告诉我它是否有效:

%

答案 2 :(得分:0)

首先,你需要了解Promises是什么。根据我对你尝试做的事情的理解,它应该是这样的:

<!-- DATE HIERARCHY -->
    {% block date_hierarchy %}
        {% if cl.date_hierarchy %}{% date_hierarchy cl %}{% endif %}
    {% endblock %}

现在,每当您需要使用号码不为零的用户名列表时,您可以调用//constructs the Parse Object var query = new Parse.Query(Parse.User); //find method returns a Promise var res = query.find() //good names will be a Promise of an array of usernames //whose value is above 0 var goodNames = res .then(function(data) { //assumes the find method returns an array of //objects, one of the properties is username //we will map over it to create an Array of promises //with the eventual results of calling the AJAX fn var numberPromises = data.map(function(obj) { //wrap the call to the cloud function in a new //promise return new Promise(resolve, reject) { someCloudFn(obj.username, function(err) { if (err) { reject(err); } else { resolve(num); } }); } }; //Promise.all will take the array of promises of numbers //and return a promise of an array of results return [data, Promise.all(numberPromises)]; }) .then(function(arr) { //we only get here when all of the Promises from the //cloud function resolve var data = arr[0]; var numbers = arr[1]; return data .filter(function(obj, i) { //filter out the objects whose username number //is zero or less return numbers[i] > 0; }) .map(function(obj) { //get the username out of the query result obj return obj.username; }); }) .catch(function(err) { console.log(JSON.stringify(err)); }); 的{​​{1}}方法并获得结果:

then