如何在循环中声明类副本

时间:2019-05-11 14:11:08

标签: javascript node.js

我有一个应用程序,它每分钟运行一次以分析商店的产品,首先,我创建了一个包含5个商店的数组,每个商店都有自己的销售额,每个销售额都有自己的产品。因此,为了开始分析,我创建了一个在所有商店中运行的forEach,因为我希望并行执行5,在forEach中我执行一个sales,在其中声明一些模块并调用销售中的方法。作为参数,在这些模块中,我对要销售的产品执行另一个,并且此循环实例化其他模块和类,当我第一次和/或第二次执行该代码时,它会正常工作,例如经过多次迭代后,例如商店1的销售123,它使用商店2的销售231使用的属性。

我不知道您是否能理解这个问题,但是这有点令人困惑,基本上,如果我声明了Sales,我希望每个循环迭代使用模块/类的副本而不更改其他迭代的属性。迭代1中的类,并且在迭代2中也声明了相同的类,该迭代无法接收迭代1的属性。简而言之,我想为每个迭代实例化一个类/模块,而又不改变彼此的属性。

这是我尝试使用对象数组存储类/模块的实例:

main.js

const analysis = require('./modules/analysis');
const check = require('./modules/check');
const api = require('../wrappers/api');

stores.forEach(async function(store) {
    let sales = [];
    await api.getSales(store.id).then((response) => {
      sales = response.result;
    })
    .catch((error) => {
      logger.error(error);
    });

    let analysisModule = {};
    let checkModules = {};

    for(const sale of sales){
         // Analysis
         analysisModule[sale.id] = Object.assign({}, analysis);
         await analysisModule[sale.id].run(sale);
         delete analysisModule[sale.id];

         // Check
         checkModules[sale.id] = Object.assign({}, check);
         await checkModules[sale.id].run(sale);
         delete checkModules[sale.id];
    }
});

check.js

const Stock = require('./stock');
const Provider = require('./provider');
const api = require('../wrappers/api');
const common = require('./common');

const check = {
    run: async function(sale) {
        var self = this;
        let items = await api.getItems(sale.id, 1);
        if (!items.success && items.result.lenght == 0) {
            return false;
        }

        let providerClass = {};
        let stockClass = {};

        for (const item of items.result) {

            // Here is problem
            providerClass[item.id] = await new Provider(sale, item);
            let allowed = await providerClass[item.id].check();
            if (!allowed) {
                continue;
            }

            // Here is problem
            stockClass[item.id] = new Stock(sale, item);
            let checked = await stockClass[item.id].check();
            if (checked) {
               continue;
            }

            delete providerClass[item.id];
            delete stockClass[item.id];
        }
    }
}

0 个答案:

没有答案