1

我想运行以下代码:

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);但这会阻止该过程。有没有更好的办法?

4

2 回答 2

2

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

于 2017-03-24T10:08:01.753 回答
2

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语法只是一种方便的方式,表示“请等待这个承诺完成后再继续执行这个函数,拜托”

于 2017-03-24T10:03:09.123 回答