【问题标题】:Pass 1 sync and 1 async variables to next async function将 1 个同步和 1 个异步变量传递给下一个异步函数
【发布时间】:2021-06-10 22:55:59
【问题描述】:

我正在使用带有简单自定义查询函数的 mongodb 领域来返回数据库数据

  function mongo(data) {
    return fetch(
      apiurl,
    {
      method: "POST",
       headers: {
          "Content-Type": "application/json",
       },
        body: JSON.stringify(data),
       }
    )
    .then((response) => {
      return response.json();
    })
    .then((data) => {
      console.log("Success:", data);
      return data;
    })
    .catch((error) => {
      console.error("Error:", error);
    });
  }

  mongo({
    collection: "metadata",
    action: "find",
    criteria: { query: {}},
  }).then((metadata) => {
    for (var i = 0; i < metadata.length; i++) {
      var oneMeta= metadata[i];
      var subjectName = oneMeta.name;
      var subjectCode = oneMeta.code;
      var blockHTML =
        `<div>
        <span class="badge badge-danger">` + subjectName + `</span>
        <span class="badge badge-dark">` + subjectCode + `</span>
        </div>`;
      var oneSubject = document.createElement("div");
      oneSubject.id = "sub_"+subjectCode 
      oneSubject.innerHTML = blockHTML;
      subjectOutput.appendChild(oneSubject);
    }
  });

我试图做另一个 mongo({collection: "actualData", action: "count", criteria: { query: {subjectId: XXX}}}) 查询 for each metadata 其中XXX 将是来自metadata[i]subjectCode

目标是使用其 id 将另一个 &lt;span&gt;count&lt;/span&gt; 附加到上面创建的 DIV,其中计数是第二个 mongo 函数的结果。

我只能在不循环metadata.length的情况下做到这一点

在使用imetadata 时,我需要在循环中的每次执行下一个函数

任何帮助表示赞赏!

【问题讨论】:

    标签: javascript mongodb mongodb-query mongodb-realm


    【解决方案1】:

    只需将您的metadata 映射到mongo 承诺的数组,await 全部,然后计数结果将在数组的相同位置:

    mongo({
        collection: "metadata",
        action: "find",
        criteria: { query: {}},
      }).then(async (metadata) => {
        const counts = await Promise.all(metadata.map((oneMeta) => {
          return mongo({collection: "actualData", action: "count", criteria: { query: {subjectId: oneMeta.subjectCode}}});
        }));
        for (let i = 0; i < metadata.length; i++) {
          const count = counts[i];
          const oneMeta = metadata[i];
          const subjectName = oneMeta.name;
          const subjectCode = oneMeta.code;
          var blockHTML =
              `<div>
              <span class="badge badge-danger">` + subjectName + `</span>
              <span class="badge badge-dark">` + subjectCode + `</span>
              <span class="badge badge-dark">` + count + `</span>
              </div>`;
          var oneSubject = document.createElement("div");
          oneSubject.id = "sub_"+subjectCode 
          oneSubject.innerHTML = blockHTML;
          subjectOutput.appendChild(oneSubject);
        }
    })

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      • 2019-09-26
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      相关资源
      最近更新 更多