异步/等待然后在我的情况下不起作用

时间:2019-02-16 11:29:13

标签: node.js

我有一个函数,其中包含一个数组中的一千个对象:

function Alltransaction(transactionArray) {
    transactionArray.map(async (transaction) => {
        dataAgainsthash = await web3.eth.getTransaction(transaction)

        TransactionObject = {
            transactionHash : transaction,
            from : dataAgainsthash.from
        };

        transactionArray.push(TransactionObject)
        console.log("transaction array", transactionArray)
    });
}

然后我有另一个函数将这数千个对象数组存储到db

function saveTransactionToDb() {
    console.log("after loop",transactionArray)
    transactionss = new Transaction({
        blockNumber : blockNumbers ,
        transactions : transactionArray
    })

    // Now save the transaction to database
    await transactionss.save();
    // console.log("save to database")
}

然后我在路由器中称呼它

await Alltransaction(transactionArray);
await saveTransactionToDb();

我也尝试

Alltransaction(transactionArray).then(saveTransactionToDb())

但是它总是在对象数组填充saveTransactionToDb()方法之前运行Alltransaction()

2 个答案:

答案 0 :(得分:1)

首先,在Alltransaction中也必须返回承诺。在您的代码中,该函数启动了一些进程,但没有等待它。另外,请勿将promise推送到原始数组。我不确定您要在此处完成什么。由于在数组上进行映射可以为您提供一个承诺数组,因此您可以使用Promise.all()统一所有承诺。

function Alltransaction(transactionArray) {
    const promises = transactionArray.map(async (transaction) => {
        dataAgainsthash = await web3.eth.getTransaction(transaction)

        const TransactionObject = {
            transactionHash : transaction,
            from : dataAgainsthash.from
        };

        return TransactionObject;
    });
    return Promise.all(promises);
}

更改saveTransactionToDb以接收一个数组,而不使用原始数组。

然后您可以将其称为:

const t = await Alltransaction(transactionArray);
await saveTransactionToDb(t);

第二次尝试不正确:

Alltransaction(transactionArray).then(saveTransactionToDb())

与以下相同:

const t = Alltransaction(transactionArray);
const s = saveTransactionToDb();
t.then(s)

这就是saveTransactionToDb无法完成交易的原因。要使用它,只需传递函数而不调用它即可:

Alltransaction(transactionArray).then(saveTransactionToDb)

答案 1 :(得分:0)

在saveTransactionToDb和Alltransaction函数之前,您是否尝试过 async 关键字?

async function Alltransaction(transactionArray){
     // your code       
}

async function saveTransactionToDb(){ // your code logic* await transactionss.save(); }