【发布时间】:2019-01-27 22:31:31
【问题描述】:
有人知道为什么这不同步运行吗?最后一个承诺似乎在第一个承诺之前解决
...
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() 永远不会触发 ether 进入下一个 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);
【问题讨论】:
-
您没有正确链接承诺以使承诺以特定顺序解决。
-
@zzzzBov 感谢您的建议。你会说它以何种方式没有正确链接?
标签: javascript asynchronous promise synchronization