首页 > 解决方案 > 如何等到整个数组被推送来执行一个函数?

问题描述

我正在为我的网站创建一个支付 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) {

                })

        })   



        }


    }
})
})

标签: javascriptarraysmongoose

解决方案


推荐阅读