使此代码更加同步运行

时间:2015-12-29 23:01:06

标签: javascript

以下是代码:

var getFile = document.getElementById("roll");
var init = getFile.files;
var rawResults = [];

if(init.length > 1){

    for(var i = 0, ii = init.length; i < ii; i++){

        Papa.parse(init[i], {
            delimiter: "",  // auto-detect
            newline: "",    // auto-detect
            header: true,
            dynamicTyping: false,
            preview: 0,
            encoding: "",
            worker: false,
            comments: false,
            step: undefined,
            complete: function(results, file) {
                rawResults.push(results.data);
            },
            error: undefined,
            download: false,
            skipEmptyLines: false,
            chunk: undefined,
            fastMode: undefined,
            beforeFirstChunk: undefined,
            withCredentials: undefined
        });
    }

    var flattening = _.flatten(rawResults);

    console.log(rawResults);
    console.log(rawResults.length);
}

当我尝试在_.flatten数组上运行rawResults下划线函数时,它变为空,因为由于getFile函数是异步的,因此数组没有准备好数据在性质上。

脚本获取上传的文件,然后通过Papa Parse进行解析,然后结果最终填充到rawResults数组中。

我尝试创建一个这样的回调函数:

function firstfunction(callbackfxn){
    // Put the asynchronous getFile code here.
    callbackfxn();
};

function secondfunction(){
    firstfunction(function(){
        // Put the parsing code in here
    });
};

我尝试了其他回调变体但没有运气让它按照预期的那样工作。

1 个答案:

答案 0 :(得分:1)

为什么不使用像bluebird或async.js这样的控制流程库?

以下是使用async#each

的示例

async.js

{
    "config": {
        "COMPOSER_DISABLE_XDEBUG_WARN": true
    }
}

循环遍历数组的每个元素,将迭代器函数应用于元素。触发完成事件后,它会调用回调函数来告诉函数它已完成。 async.each(init, function(file, callback) { Papa.parse(init[i], { delimiter: "", // auto-detect newline: "", // auto-detect header: true, dynamicTyping: false, preview: 0, encoding: "", worker: false, comments: false, step: undefined, complete: function(results, file) { rawResults.push(results.data); callback(); }, error: undefined, download: false, skipEmptyLines: false, chunk: undefined, fastMode: undefined, beforeFirstChunk: undefined, withCredentials: undefined }); }, function(error) { // do something if error var flattening = _.flatten(rawResults); console.log(rawResults); console.log(rawResults.length); }); 的最后一个参数是错误函数。一旦处理完所有元素,就会调用它。调用此函数后,应填充rawResults。