【发布时间】:2016-04-02 10:29:27
【问题描述】:
我有以下 HTML 代码:
<input type='file' multiple>
这是我的 JS 代码:
var inputFiles = document.getElementsByTagName("input")[0];
inputFiles.onchange = function(){
var fr = new FileReader();
for(var i = 0; i < inputFiles.files.length; i++){
fr.onload = function(){
console.log(i) // Prints "0, 3, 2, 1" in case of 4 chosen files
}
}
fr.readAsDataURL(inputFiles.files[i]);
}
所以我的问题是,我怎样才能使这个循环同步?那就是首先等待文件完成加载,然后继续下一个文件。有人告诉我使用 JS Promises。但我无法让它工作。这是我正在尝试的:
var inputFiles = document.getElementsByTagName("input")[0];
inputFiles.onchange = function(){
for(var i = 0; i < inputFiles.files.length; i++){
var fr = new FileReader();
var test = new Promise(function(resolve, reject){
console.log(i) // Prints 0, 1, 2, 3 just as expected
resolve(fr.readAsDataURL(inputFiles.files[i]));
});
test.then(function(){
fr.onload = function(){
console.log(i); // Prints only 3
}
});
};
}
提前谢谢...
【问题讨论】:
-
Promise 用于异步操作。
-
那我如何让它同步呢?我在网上研究过,他们都说它使代码同步
-
@ZahidSaeed:不,promise 不会使代码同步。你能指出“所有人”都说他们这样做的地方之一吗?
-
MDN 说:“Promise 代表一个值的代理,在创建 Promise 时不一定知道。它允许您将处理程序与异步操作的最终成功值或失败原因相关联。这允许异步方法返回值,如 SYNCHRONOUS METHODS":
-
是的。如果同步意味着您可以控制文件读取代码的不同部分的执行顺序,则可以使其以同步方式运行。但它仍然会异步运行,例如鼠标处理程序或 JavaScript 引擎本身。 “像同步方法”与“是同步方法”不同。
标签: javascript promise filereader synchronous