等待循环

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 中的异步函数实际上不是异步的。