谁知道为什么它不能同步运行?最后的承诺似乎在第一个承诺之前解决了
...
var promise = Promise.resolve();
promise.then( () => {
return new Promise((resolve, reject) => {
var file1 = fileChooserCSV.files[0];
var reader1 = new FileReader();
reader1.onload = function(){
var csv = reader1.result;
csvJson = csvJSON(csv);
resolve();
};
reader1.readAsText(file1);
});
});
promise.then( () => {
return new Promise((resolve, reject) => {
var file2 = fileChooserConfig.files[0];
var reader2 = new FileReader();
reader2.onload = function(){
var config = reader2.result;
configJson = JSON.parse(config);
resolve();
};
reader2.readAsText(file2);
});
});
promise.then( () => {
return new Promise((resolve, reject) => {
console.log('end');
resolve();
});
});
阅读器的onload方法似乎从来没有执行过,尽管它们确实应该执行(有数据传递给它们),并且在将它们移到promise之前已经执行了。由于onload不会运行,resolve()永远不会触发以太币进入下一个then(),但是最后一个then()会执行...
如果有任何区别,此代码将在chrome扩展程序弹出窗口中运行?
非常感谢!
更新..
以经典的嵌套方式对其进行重组会很好
var file1 = fileChooserCSV.files[0];
var reader1 = new FileReader();
reader1.onload = function(){
var csv = reader1.result;
csvJson = csvJSON(csv);
var file2 = fileChooserConfig.files[0];
var reader2 = new FileReader();
reader2.onload = function(){
var config = reader2.result;
configJson = JSON.parse(config);
console.log('end');
};
reader2.readAsText(file2);
};
reader1.readAsText(file1);
答案 0 :(得分:0)
在JS运行时中,“ then”被移动到另一个堆栈,并且仅在调用堆栈为空时执行。
例如,在这里您创建我创建一个像您一样的Promise.resolve()
。但是请注意,只有在执行了整个代码之后,它才被执行。您会在屏幕上看到“ 53”,而不是预期的“ 35”:
const promise = Promise.resolve(3)
promise.then(res => {
document.write(res)
})
document.write(5)
'then'存储在其他堆栈中,并且仅在以后执行。
有关更多信息,请查看Barak Chemo的this perfect explanation。观看到30:40。
希望有帮助
答案 1 :(得分:-1)
您尝试了Promise.All()。然后...像这样
var promise = Promise.resolve(3);
Promise.all([true, promise])
.then(function(values) {
console.log(values); // [true, 3]
});