繁体   English   中英

Javascript Promise不会在下一个Then()之前等待解决

[英]Javascript Promise not waiting to resolve before next Then()

有人知道为什么它不同步运行吗? 最后的承诺似乎在第一个承诺之前解决

...

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);

在JS运行时中,“ then”被移动到另一个堆栈,并且仅在调用堆栈为空时才执行。

例如,在这里您创建我创建一个像您一样的Promise.resolve() 但是请注意,只有在执行了整个代码之后,它才被执行。 您会在屏幕上看到“ 53”,而不是预期的“ 35”:

const promise = Promise.resolve(3)

promise.then(res => {
  document.write(res)
})

document.write(5)

'then'存储在附加堆栈中,仅在以后执行。

欲了解更多信息,请查看这个完美的解释表格Barak Chemo。 观看到30:40。

希望能帮助到你

你试过Promise.All()。然后...像那样

var promise = Promise.resolve(3);
Promise.all([true, promise])
    .then(function(values) {
        console.log(values); // [true, 3]
});

https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM