javascript - 等待循环

标签 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 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() 返回之前运行处理过的数组。我可以将其重写为 let logs = await getEncodedLogs(transaction.logs); 但这会阻止进程。有没有更好的办法?

最佳答案

所以目前这个例子中没有任何东西是真正异步的或者需要涉及 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 中的异步函数实际上不是异步的。

关于javascript - 等待循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42996304/

相关文章:

javascript - 为什么 forEach 优于常规迭代器?

javascript - 异步函数永不返回

javascript - 正确使用 Promises 和 Await/Async

javascript - 使用 Javascript 设置 Cookie 并清理值

javascript - 如何使 Qooxdoo 虚拟列表具有可扩展性?

javascript - ES6 传播元素 - 默认值

javascript - ECMAScript 2017 : Where Did "13.2 Creating Function Objects" Go (from ES5)?

javascript - 如何在与其数据对应的位置插入 Enter() 选择?

javascript - 如何从深层 li 结构创建 json 输出

javascript - 使用 Reduce 将数字数组分成 3 block