【发布时间】:2018-01-22 07:08:54
【问题描述】:
我有 3 个函数,每个函数都返回一个承诺。如何将每个承诺的响应分配给定义的对象?
这是我的代码:
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 });
});
这是webAuditsFailures函数,它依次调用另一个返回promise的函数
export default async (req) => {
const report = req.body.webAudits;
const def = deferred();
if(report.length > 0) {
var reportList = [];
for(const [reportIndex, item] of report.entries()) {
for(const [runIndex, run] of item.runs.entries()) {
const result = await waComplianceBusiness(req, run.id);
var failureList = [];
if(result.data.overviews) {
const compliance = result.data.overviews[0].compliance;
if(compliance) {
for(const [index, rule] of compliance.entries()) {
const response = await waRuleOverview(req, run.id, rule.id);
const failedConditions = response.data.failedConditions;
const ruleName = response.data.ruleName;
if(response.data.pagesFailed > 0) {
for(const [condIndex, 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
}
waConditionOverview(req, body).done(response => {
// do stuff here
});
}
}
}
if(failureList.length > 0) {
item.runs[runIndex].failures = failureList;
}
}
}
}
}
def.resolve(report);
return def.promise
}
else {
return [];
}
}
【问题讨论】:
-
能否发布 webAuditsFailures() 函数并解释什么是 req?
-
@MarioSantini 我更新了这个问题。 Req 是路由请求
-
什么是
deferred(),为什么不用new Promise()?此外,您还返回了[]或def.promise,这可能会使调用代码混淆。您可能想坚持使用一种返回类型。 -
@styfle Deferred 是一个节点模块npmjs.com/package/deferred ...我不使用
new Promise(),因为我不知道如何在我的代码中实现它 -
也许我明白了。您的函数被标记为 async,当您调用该函数时,它会返回一个 Promise。这意味着如果您不使用await,您的代码将继续运行而不是等待。因为它期望你处理承诺,就像你实现 .then() 部分一样。
标签: javascript node.js promise