[英]Loop with await
我想运行以下代码:
const express = require('express');
const app = express();
app.post('/getTransaction', (req,res) => {
let transaction = getTransaction(req.body.id);
let logs = getEncodedLogs(transaction.logs);
console.log('SEND'); // Gets called before getEncodedLogs() returns Array
return res.send(Object.assign(transaction, { logs }));
});
async function getEncodedLogs(logs) {
let logsDecoded = [];
await Promise.all(logs.map(async (log) => {
logsDecoded.push({
logIndex: log.logIndex,
data: log.data,
topics: log.topics
});
}));
console.log(logsDecoded);
return logsDecoded;
}
app.listen(process.env.PORT || 8000);
我遇到的问题是res.send(Object.assign(transaction, { logs }));
在getEncodedLogs()
返回已处理的Array
之前运行。 我可以重写它, let logs = await getEncodedLogs(transaction.logs);
但这会阻止该过程。 有没有更好的办法?
getEncodedLogs(transaction.logs)
不会返回您的日志,它会返回一个Promise,它在完成1时会解析为您的日志。 使此功能按预期工作的最简单方法是添加.then
回调:
app.post('/getTransaction', (req, res) => {
let transaction = getTransaction(req.body.id);
getEncodedLogs(transaction.logs).then(logs => {
console.log('SEND');
res.send(Object.assign(transaction, { logs }));
});
});
1.就像所有async
函数一样, await
语法只是一种简便的方式:“请先等待此承诺完成,然后再继续执行此函数,”
因此,当前该示例中的任何内容实际上都不是异步的,也不需要涉及Promise。 getTransactions可能但没有看到我无法告知的实现。 因此,答案可以这样表示
const express = require('express');
const app = express();
app.post('/getTransaction', (req,res) => {
let transaction = getTransaction(req.body.id);
let logs = getEncodedLogs(transaction.logs);
console.log('SEND'); // Gets called before getEncodedLogs() returns Array
return res.send(Object.assign(transaction, { logs }));
});
function getEncodedLogs(logs) {
return logs.map((log) => {
return {
logIndex: log.logIndex,
data: log.data,
topics: log.topics
};
}));
}
app.listen(process.env.PORT || 8000);
如果我们更深入地研究问题的以下部分
let logsDecoded = [];
await Promise.all(logs.map(async (log) => {
logsDecoded.push({
logIndex: log.logIndex,
data: log.data,
topics: log.topics
});
}));
logDecoded只是一个普通数组,因此map中的异步功能实际上不是异步的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.