javascript - 如何等到整个数组被推送来执行一个函数?
问题描述
我正在为我的网站创建一个支付 API,这个 API 是围绕 Monero 设置的,我正在获取支付所需的值以及从我的 MongoDB 数据库中将它们发送到何处。我正在使用猫鼬来做到这一点
我已经把所有的东西都绘制好了,它从一个数组中获取当天需要支付的总净值,并从另一个数组中获取最新的钱包条目,这样它就知道将金额发送到哪里。
当我试图用这些数据构造一个新数组并将这些数据推入其中时,就会出现问题。
门罗币本质上只允许一次发送一笔交易,锁定你的剩余余额和发送的金额,直到一笔交易被完全确认。一个事务可以拆分为多个事务,但都必须作为“一个”大块发送。
因此,当我向 Monero 发送请求时,它必须包含每个钱包的数组以及每个钱包收到的金额。
当我推送到阵列时,我注意到它每次推送到阵列时都会执行 Transfer Monero 函数。我该如何做到这一点,以便在发送该变量以进行转移之前,首先使用符合我的 if 语句的每个可能值(日期是今天,paymentStatus 设置为 false,应付金额不等于或低于 0)完全推送数组使用门罗币功能?
我已经尝试过使用返回函数等。不确定如何实现 async/await 或 Promises
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var moment = require('moment');
var User = require('../models/user');
var moneroWallet = require('monero-nodejs');
var Wallet = new moneroWallet('127.0.0.1', 18083);
var destinations = []
var xmrnet = []
// connect to MongoDB
mongoose.connect('mongodb://)
// Fetch IDs
function getID(){
var cursor = User.find({}, function (err, users) {
}).cursor();
return cursor;
}
var cursor = getID();
cursor.on('data', function(name){
var id = name.id
// Map all users using IDs
function getUsers(){
var cursor = User.findById(id, function (err, users) {
}).cursor();
return cursor;
}
var cursor = getUsers();
cursor.on('data', function(user){
net = user.netHistory.map(element => element)
order = user.orderHistory.map(element => element)
userWallets = user.userWallets.map(element => element)
var today = moment();
// date is today? validation
for (var i = 0; i < net.length; i++){
netDate = net[i].net_date_time
netStatus = net[i].paymentStatus
netUSD = net[i].current_usd_net
xmrnet = net[i].xmr_net
for (var j = 0; j < userWallets.length; j++){
xmrwalletsU = userWallets[j].xmr_wallet
if(xmrwalletsU !== ''){
xmrwallet = xmrwalletsU
}
}
var Dateistoday = moment(netDate).isSame(today, 'day');;
if (Dateistoday === true && xmrnet !== 0 && netStatus === false){
console.log('its true')
netid = net[i].id
var destinationsU = [{amount: xmrnet, address: xmrwallet}]
destinations.push(destinationsU)
console.log(destinations)
// problem is right here with destinations^ it pushes one by one
// problem over here as well as wallet.transfer executes one by one by the time it gets to the second, the balance is already locked, unable to send
Wallet.transfer(destinations).then(function(transfer) {
console.log(transfer);
var payouts = {
payout_date_time: Date(),
payout_usd_amount: netUSD,
xmr_wallet: xmrwallet,
xmr_txid: transfer.tx_hash,
}
// add payout to payoutHistory array
User.findByIdAndUpdate(id, {"$addToSet": { 'payoutHistory': [payouts]}},
function(err, user) {
if(err) { console.log(err) }
else {
console.log()
};
})
// update paymentStatus of specific net entry to true
User.updateMany({
"_id": id,
"netHistory._id": netid
}, {
"$set": {
"netHistory.$.paymentStatus": true
}
}, function(error, success) {
})
})
}
}
})
})