回调不适用于全局变量

时间:2019-01-23 09:13:04

标签: javascript arrays asynchronous callback

我是JS的新手。我的主要语言是Java。所以我完全与以下代码混淆。想法是获取一堆文件,对其进行解析,获取一个唯一的字符串,创建一个对象并将其推入结果数组,该数组是一个全局变量。然后,我需要对其进行字符串化并做其他一些事情。

dropArea.addEventListener('drop', handleDrop, false);

var resultArray = {payers: []};

function handleDrop(event) {
    let files = event.dataTransfer.files;
    processFiles(files, processPayersArray);
}

function processFiles(files, callback) {
    ([...files]).forEach(file => processSingleFile(file));

    callback();
}

function processSingleFile(file) {
    let reader = new FileReader();
    reader.onload = (function(reader) {
        return function() {
            reader.result
                .split('\n')
                .filter(s => s.includes('Плательщик='))
                .map(s => s.split('=')[1].trim())
                .filter(function(s, pos, arr) {
                    return arr.indexOf(s) === pos;
                })
                .forEach(s => resultArray.payers.push(new PayerObj(s)));
        }
    })(reader);

    return reader.readAsText(file, WIN1251);
}

function processPayersArray(array) {
    console.log("Array:");
    console.log(array);

    let json = JSON.stringify(array);
    console.log("Json: ");
    console.log(json );
}

控制台输出完全使我感到困惑:

Array:
{payers: Array(0)}payers: (4) [PayerObj, PayerObj, PayerObj, PayerObj]
Json: 
{"payers":[]}

出了什么问题?函数 processPayersArray 是函数 processFiles 的回调,它必须在([... files])。forEach(file => processSingleFile(file))操作之后启动。 / p>

0 个答案:

没有答案