Javascript如何链接多个承诺

时间:2018-02-08 04:23:00

标签: javascript asynchronous promise

在解析中我有这个疯狂的查询,我在table1上查询以获取一个对象。

然后在指针列上查询table2,该列匹配table1的所有与之匹配的用户的结果。

接下来,我需要创建一个对象,然后使用第一个对象的结果创建另一个对象。

最后将最终对象从table2的查询中保存到用户中。

我遇到一个链接所有内容的问题,由于某种原因,我的成功消息在保存用户对象之前返回。

Parse.Cloud.define('startChain', (req, res) => {

let q1 = new Parse.Query("Table1");

q1.equalTo("objectId", req.params.q1ID);
q1.equalTo("user", req.user);
q1.include("user");

q1.get(req.params.q1ID)
.then(post => {
  post.get("user")
  .then(user => {
   // Query on q1
   let q2 = new Parse.Query("Table2");
   q2.equalTo("t1Object", post);
   w2.include("user2");
   q2.include("pointer2Object");
   q2.find();
 })
 .then(users => {
  var morePromises = users.map(aUser => {
    let newObject = new Parse.Object.Extend("Table3");
    newObject.set("user", aUser);
    newObject.set("table1Pointer", post);
    newObject.save()
    .then(result => {
      var object2 = new Parse.Object.Extend("Table4");
      object2.set("column1", aUser);
      object2.set("column2", result);
      var object3 = new Parse.Object.Extend("Table5");
      object2.save()
      .then(o2 => {
        object3.set('column', 'o2');
        object3.save()
        .then(o3 => {
          aUser.set("o3", o3);
          return aUser.save(null, {useMasterKey: true});
        });
      });
    });
  });
  Promise.all(morePromises)
  .then(result => res.success());
})
.catch(err => {
 res.error(err.message);
});
});
});

2 个答案:

答案 0 :(得分:0)

在第一行

q1.get(req.params.q1ID)
.then(post => {

then()回调的参数是q1.get()返回的内容。

遵循相同的逻辑,您可以通过从链接块返回下一个所需的内容来链接单个级别(即未嵌套)的承诺。例如,上述内容可以继续如下

q1.get(req.params.q1ID)
.then(post => {

   ...

   return q2.find();

 }).then( users => {

     // users is available here

     ...

     return object2.save();

 }).then( o2 => {

 });

等等......

答案 1 :(得分:0)

理想情况下,您应该使用async await:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

会更清晰,代码示例如下:

async function yourFunction(x) {
  const result = await q2.find();
  result.map((newObject) => {
      await newObject.save();
  });
}

不确定您的浏览器是否支持。