繁体   English   中英

等待循环

[英]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)不会返回您的日志,它会返回一个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语法只是一种简便的方式:“请先等待此承诺完成,然后再继续执行此函数,”

因此,当前该示例中的任何内容实际上都不是异步的,也不需要涉及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中的异步功能实际上不是异步的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM