Node.js处理链式承诺的响应

时间:2017-08-14 12:31:58

标签: javascript node.js promise

我有3个函数,每个函数都返回一个promise。如何将每个promise的响应分配给定义的对象?

这是我的代码:

y_max($geometry)

这是我尝试过的:

  const runResponse = {
    webAudits: [],
    webJourneys: [],
    appJourneys: []
  };

  webAuditsFailures(req)
  .then(
    appJourneysFailures(req)
  )
  .then(
    webJourneysFailures(req)
  ).then(
    res.status(201).json({ reports: runResponse })
  );

但它没有按预期工作,因为webAuditsFailures(req) .then( (response) => { runResponse.webAudits = response }, appJourneysFailures(req) ) .then( (response) => { runResponse.appJourneys = response }, webJourneysFailures(req) ).then( (response) => { runResponse.webJourneys = response }, res.status(201).json({ reports: runResponse }) ); 被再次调用,即使它没有结束,我也不明白为什么......

这些是解决此问题的其他失败尝试:

使用webAuditsFailures

await

同样的事情发生在这个:

  const webAudits = await webAuditsFailures(req);
  const appJourneys = await appJourneysFailures(req);
  const webJourneys = await webJourneysFailures(req);

  runResponse.webAudits = webAudits;
  runResponse.webJourneys = webJourneys;
  runResponse.appJourneys = appJourneys;

使用 const webAudits = await webAuditsFailures(req); runResponse.webAudits = webAudits; 模块:

co

使用 co(function* () { var runResponse = yield { webAudits: webAuditsFailures(req), webJourneys: appJourneysFailures(req), appJourneys: webJourneysFailures(req) }; res.status(201).json({ reports: runResponse }); });

Promise.all

这是Promise.all([webAuditsFailures(req), appJourneysFailures(req), webJourneysFailures(req)]) .then(function(allData) { res.status(201).json({ reports: allData }); }); 函数,它依次调用另一个返回promise

的函数
webAuditsFailures

2 个答案:

答案 0 :(得分:2)

这是问题所在:

waConditionOverview(req, body).done(response => {
  // do stuff here
});

您正在执行异步操作但不等待结果。不要使用延迟模型 - 使用util.promisify进行回调。

此外,我强烈建议不要像这样改变请求/ resposne,而是将信息存储在对象中并返回它们。

以下是编写代码的方法:

export default async (req) => {
  const report = req.body.webAudits;  
  if(report.length === 0) return;
  const runs = Array.from(report.entries(), ([i, item]) => item.runs.entries());
  for (const [_, run] of runs) {
    const result = await waComplianceBusiness(req, run.id);
    var failureList = [];
    if (!result.data.overviews) {
      continue;
    }
    const compliance = result.data.overviews[0].compliance;
    if(!compliance) {
      continue;
    }
    for(const [_, rule] of compliance.entries()) {
      const response = await waRuleOverview(req, run.id, rule.id);
      const { failedConditions, ruleName} = response.data;

      if(failureList.length > 0) {
        item.runs[runIndex].failures = failureList;
      }
      if(response.data.pagesFailed === 0) continue;

      for(const [_, condition] of failedConditions.entries()) {
        const request = {
          itemId: condition.conditionResult.id,
          itemType: condition.conditionResult.idType,
          parentId: condition.conditionResult.parentId,
          parentType: condition.conditionResult.parentType
        }
        const body = { runId: run.id, ruleId: rule.id, payload: request}
        const reponse = await waConditionOverview(req, body);
        // do stuff here
        // update response
        // update report, so next time we try it's updated and doesn't return empty;
      }
    }
  }
  return report;
}

答案 1 :(得分:1)

在承诺链中,当前.then()应返回承诺。此承诺的结果将传递给下一个.then()

webAuditsFailures(req)
  .then((response) => {
    runResponse.webAudits = response;
    return appJourneysFailures(req); // return a promise
  })
  .then((response) => { // response contains the result of the promise
    runResponse.appJourneys = response;
    return webJourneysFailures(req);
  })
  .then((response) => {
    runResponse.webJourneys = response;
    res.status(201).json({ reports: runResponse });
  });

根据上一个.json().then()的作用,如果promise链中还有其他.then(),则应该返回该值。