Как я узнаю, какое обещание разрешится первым? - PullRequest
0 голосов
/ 07 октября 2019

У меня есть фрагмент, с которым я играю, где я специально поместил Promise.resolve(c) до Promise.resolve(a), но я замечаю, что значение true снизу Promise.all(...) регистрируется первым.

const https = require('https');

function getData(substr) {
    let url = ``;
    return new Promise((resolve, reject) => {
        try {
            https.get(url, res => {
                let s = '';
                res.on('data', (d) => {
                    s += d
                });

                res.on('end', () => {
                    let data = JSON.parse(s);
                    resolve(data);
                })
            })
        } catch (e) {
            reject(e);
        }
    })
}

let a = getData('spiderman');

let b;

let c = getData('superman');

Promise.resolve(c)
    .then(value => console.log(value));

Promise.resolve(a)
    .then(value => b = value);

Promise.all([a]).then(values => console.log(values[0] === b)); 

Есть ли объяснение, почему это так? Я бы подумал, что поскольку Promise.resolve(c) стоит первым, то Promise c разрешится первым и будет зарегистрировано. Или нет способа фактически полагаться на порядок журналов, кроме использования обратных вызовов? Каковы лучшие методы, чтобы избежать таких проблем?

Ответы [ 4 ]

4 голосов
/ 07 октября 2019

Это асинхронные вызовы, которые при полном разрешении передаются с использованием предоставленной функции затем.

Невозможно заставить один из них завершиться раньше, и если вам нужно, вы должны запустить эти синхронные.

Когда вы вызываете .then (), он вызывается только тогда, когда функция завершена, а не когда вызывается .resolve.

2 голосов
/ 07 октября 2019

Порядок разрешения обещаний не гарантируется. В этом и заключается смысл асинхронного кода.

Если вы полагаетесь на порядок выполнения, вам следует использовать синхронный код.

0 голосов
/ 07 октября 2019

Ну, как уже было сказано, порядок выполнения обещания не гарантирован, потому что это асинхронная операция.

Если вам действительно нужно выполнение, чтобы следовать определенному порядку, вам нужно поставить следующую вещьбыть выполненным внутри then или использовать async и await, что намного чище.

0 голосов
/ 07 октября 2019

Используйте Promise.all() с обоими запросами, если вы хотите, чтобы они оба были выполнены до следующего шага.

let a = getData('spiderman');

let c = getData('superman');

Promise.all([a, c]).then(([spidyResults, superResults]) => {
    // both have sompleted
    // do stuff with each set of results

}).catch(err => console.log('Ooops, one of them failed') );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...