簡體   English   中英

Javascript如何鏈接多個承諾

[英]Javascript how to chain multiple promises

在解析中,我有一個瘋狂的查詢,我在其中查詢table1以獲取對象。

然后在與table1的結果匹配的指針列上查詢所有匹配該表的用戶的table2。

接下來,我需要創建一個對象,然后使用該第一個對象的結果創建另一個對象。

最后,將最終對象從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);
});
});
});

在第一行

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

then()回調的參數是q1.get()返回的q1.get()

按照相同的邏輯,您可以通過從鏈塊中返回下一個所需的內容,在單個級別(即不嵌套)上鏈接promise。 例如以上可以繼續像

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

   ...

   return q2.find();

 }).then( users => {

     // users is available here

     ...

     return object2.save();

 }).then( o2 => {

 });

依此類推...

理想情況下,您應該使用異步等待: https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/async_function

會更干凈,下面的代碼示例:

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

不確定您的瀏覽器是否支持

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM