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哪个进程将被阻止?+仅用于脚注+仅用于脚注