我有一个函数,其中包含一个数组中的一千个对象:
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()
答案 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();
}