我想运行以下代码:
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()
返回之前运行处理过的数组
。我可以将其重写为 let logs = await getEncodedLogs(transaction.logs);
但这会阻止进程。有没有更好的办法?
最佳答案
所以目前这个例子中没有任何东西是真正异步的或者需要涉及 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 中的异步函数实际上不是异步的。
关于javascript - 等待循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42996304/