Обещание Javascript, не ожидающее разрешения до следующего - PullRequest
0 голосов
/ 27 января 2019

Кто-нибудь знает, почему это не работает синхронно?Последнее обещание, кажется, разрешается до первого

...

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 не запускается, resol () никогда не запускает эфир, чтобы перейти к следующему 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);

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Во время выполнения JS 'then' перемещается в другой стек и выполняется только тогда, когда стек вызовов пуст.

Например, здесь, где вы создаете, я создаю Promise.resolve(), как вы.Но обратите внимание, что тогда он выполняется только после того, как весь код был выполнен.Вы увидите на экране «53» вместо ожидаемого «35»:

const promise = Promise.resolve(3)

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

document.write(5)

«then» сохраняется в дополнительном стеке и выполняется только позже.

Для получения дополнительной информации посмотритена это идеальное объяснение форма Барака Чемо.Смотрите до 30: 40.

Надеюсь, это поможет

0 голосов
/ 27 января 2019

ты пробовал 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

...