Javascript 循环等待
我想运行以下代码:Javascript 循环等待,javascript,ecmascript-6,ecmascript-2017,Javascript,Ecmascript 6,Ecmascript 2017,我想运行以下代码: 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
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()
返回已处理的数组之前运行code>。我可以将其重写为let logs=wait getEncodedLogs(transaction.logs)代码>但这将阻止该过程。有更好的方法吗?getEncodedLogs(transaction.logs)
不返回您的日志,它返回一个承诺,在完成后解析为您的日志1。要使其按预期工作,最简单的方法是添加一个。然后回调:
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 }));
});
});
一,。与所有的async
函数一样,await
语法只是一种方便的方式,表示“在继续执行此函数之前,请等待此承诺完成”getEncodedLogs(transaction.logs)
不会返回您的日志,它返回一个承诺,该承诺在完成后解析为您的日志1。要使其按预期工作,最简单的方法是添加一个。然后回调:
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 }));
});
});
一,。正如所有的async
函数所做的那样,await
语法只是一种方便的方式,表示“在继续执行此函数之前等待此承诺完成,请”因此,本例中目前没有任何内容是实际异步的或需要包含承诺。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中的异步函数实际上不是异步的。因此,本例中目前没有任何内容是异步的,或者需要包含承诺。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中的异步函数实际上不是异步的。异步函数getEncodedLogs
返回一个承诺。。。因此,您可以使用等待或使用日志。然后等待getEncodedLogs
返回的承诺进行解析,而不。。。等待承诺的解决不会阻碍流程
@JaromandaX还有其他问题。像logsdeconded.push一样,getEncodedLogs不是异步的,但是它有异步和Promise.alloh,是的,还有其他问题-这就是为什么异步/等待是个坏主意-它让一些人错误地感觉到他们的异步代码已经转换为同步代码-这可能会以某种方式“阻止进程”“我是ES7新手,希望运行以下代码”ES7不支持async/await。ES2017将支持。为什么此函数是异步的:async(log)=>{
?“在getEncodedLogs()返回数组之前被调用“getEncodedLogs
返回承诺”。但这会阻止该过程。"_哪个进程将被阻止?async
函数getEncodedLogs
返回一个承诺…因此您可以等待
或使用日志。然后
等待getEncodedLogs
返回的承诺进行解析和否…等待承诺解析不会阻止进程
@JaromandaXre还有其他问题。像logsDecoded.push-in getEncodedLogs不是异步的,但它有异步和承诺。alloh,是的,还有其他问题-这就是为什么async/await是一个如此糟糕的主意-它给一些人一种错误的感觉,即他们的异步代码已转换为同步代码-这可能会以某种方式“阻止进程”“我是ES7新手,希望运行以下代码”ES7不支持async/await。ES2017将支持。为什么此函数是异步的:async(log)=>{
?“在getEncodedLogs()返回数组之前被调用“getEncodedLogs
返回承诺”。但这会阻止该过程。“u哪个进程将被阻止?+仅用于脚注+仅用于脚注