Array.map+try/catch传递了引用赋值延迟
Array.map+try/catch passed reference assignment delay
我注意到,在[].map后面引用try/catch块确实会有延迟。我想知道为什么以及如何避免这种行为?
我的测试用例是:
-file_picked是类型为file的输入的更改事件的处理程序
file_picked: function(e){
var flist = e.target.files, //all picked files
parsed = [], //all ok read
errors = []; //all errored
//parse files
_.map(flist, function(file){
var reader = new FileReader();
//set callbacks
reader.onload = function(e){ //@reading done
try{
var file_cont = e.target.result,
parser = new(less.Parser)({
filename: file.name
});
//run file through the less parser
parser.parse(file_cont, function (err, tree) { //parser done
var o = {};
if (err) { //@some parser error occured
err('less parser error',err);
o[file.name] = err;
errors.push(o);
}else{ //@parsed successfully by the less parser
o[file.name] = tree.toCSS();
parsed.push(o);
}
});
}catch(e){
err('reader onload exception',arguments);
var o = {}; o[file.name] = i18n('Parsing failed');
errors.push(o);
}
};
reader.onerror = function(e){ //@reading error
err('reader onerror',arguments);
var o = {}; o[file.name] = i18n('Reading failed with error: ')+e.target.error.code;
errors.push(o);
};
//start reading
reader.readAsText( file );
});
//reading completed
console.log(parsed)
for( var i = 0; i < parsed.length; i++ ) {
console.log(parsed[i],errors);
}
}
我在控制台中看到了解析后的数组!但它从来没有迭代过,为什么?
提前感谢
PS.:_。map是undercore.js方法,呃,lg只是console.xxx包装器。
您可以用这种方式来完成,这样迭代解析文件的函数只会在所有异步调用完成后运行:
_.wrapp在函数被调用n次后立即运行它,在您的情况下是flist.length
[file_picked: function(e){
var flist = e.target.files, //all picked files
parsed = [], //all ok read
errors = ['],
readParsed; //all errored
//parse files
_.map(flist, function(file){
var reader = new FileReader();
//set callbacks
reader.onload = function(e){ //@reading done
try{
var file_cont = e.target.result,
parser = new(less.Parser)({
filename: file.name
});
//run file through the less parser
parser.parse(file_cont, function (err, tree) { //parser done
var o = {};
if (err) { //@some parser error occured
err('less parser error',err);
[file.name] = err;
errors.push(o);
}else{ //@parsed successfully by the less parser
[file.name] = tree.toCSS();
parsed.push(o);
}
readParsed();
});
}catch(e){
err('reader onload exception',arguments);
var o = {}; [file.name] = i18n('Parsing failed');
errors.push(o);
readParsed();
}
};
reader.onerror = function(e){ //@reading error
err('reader onerror',arguments);
var o = {}; o'[file.name'] = i18n('Reading failed with error: ')+e.target.error.code;
errors.push(o);
readParsed();
};
//start reading
reader.readAsText( file );
});
readParsed = _.after(flist.length, function(){
console.log(parsed);
for( var i = 0; i < parsed.length; i++ ) {
console.log(parsed[i],errors);
}
});
}][1]
map
函数是同步的,但在传递给map
函数的回调函数内部,您正在执行异步操作。
reader.readAsText( file );
是异步的。
这意味着map
函数在任何数据被附加到parsed
数组之前返回。一个简单的修复方法是通过在onload
和onerror
回调中添加计数器来跟踪处理了多少文件。当已处理的文件数达到flist.length
时,您将调用一个函数来处理parsed
。
相关文章:
- Javascript/Html 未捕获的引用错误:赋值中的左侧无效;未捕获的引用错误:未定义计算
- 在javascript中构建HTML表,得到“引用错误:左侧无效赋值”
- 在引用错误中将字符串放在一起:左侧的赋值无效
- 未捕获的引用错误:赋值(匿名函数)中的左侧无效
- Array.map+try/catch传递了引用赋值延迟
- 为什么不是't当给这个对象赋值时,它是通过引用传递的
- json数组对象引用赋值让我困惑
- 赋值一个新对象并保持引用
- Javascript对象内容通过引用赋值,这是可能的吗?
- 给闭包内的变量赋值一个对闭包的引用——它会泄漏吗?
- Javascript通过引用和局部变量赋值传递
- JavaScript中的链式赋值和循环引用
- Angular Service——返回私有值vs .引用私有值赋值
- 相当于JavaScript中的引用赋值
- 未捕获引用错误:赋值中的左侧无效(更改css背景色)
- 对象的任何方面都是通过引用来破坏赋值的吗
- 如果第一个条件为true,则在javascript中为变量赋值,引用错误左侧赋值无效
- Javascript 在维护引用时对对象进行变量赋值
- 变量赋值 - Javascript: array1[0] = array2[0];这是按值传递还是按引用传递
- 引用错误:对象赋值中的左侧无效