等待循环
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)
不会 return 你的日志,它 return 是一个 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
语法只是 'wait for this promise to finish before you carry on executing this function, please'
的一种方便表达方式
因此,目前此示例中没有任何内容实际上是异步的或需要涉及 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 中的异步函数实际上不是异步的。
我要运行以下代码:
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)
不会 return 你的日志,它 return 是一个 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
语法只是 'wait for this promise to finish before you carry on executing this function, please'
因此,目前此示例中没有任何内容实际上是异步的或需要涉及 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 中的异步函数实际上不是异步的。