【发布时间】:2017-08-17 04:52:38
【问题描述】:
我要运行以下代码:
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);,但这会阻止该过程。有没有更好的办法?
【问题讨论】:
-
async函数getEncodedLogs返回一个promise ...所以你要么await要么使用logs.then等待getEncodedLogs返回的promise解决 -
不...等待承诺解决不会
block the process -
@JaromandaX 还有其他问题。就像getEncodedLogs中的logsDecoded.push不是异步的,但是它有async和Promise.all
-
哦,是的,还有其他问题——这就是为什么 async/await 是一个糟糕的主意——它给一些人一种错误的感觉,即他们的异步代码已经转换为同步代码——这可能以某种方式“阻止进程”
-
“我是 ES7 新手,想运行以下代码” ES7 不支持 async/await。 ES2017 将。为什么这个函数是异步的:
async (log) => {? “在 getEncodedLogs() 返回数组之前调用”getEncodedLogs返回一个承诺。 “但这会阻塞进程。”_ 哪个进程会被阻塞?
标签: javascript ecmascript-6 ecmascript-2017