Asynchronous JS zawsze był trochę mylący dla mnie ...

Mam ten przykładowy kod:

function asyncFunction() {
    return new Promise(function(resolve, reject) {
        resolve([1, 2, 3, 4, 5])
    })
};

function example() {
    asyncFunction().then(
        output => {
            for (element of output) {
                console.log(element + ", A") //This should be displayed first
            }
        }
    )
};

example();

console.log('B'); //But it isn't

Który daje następujący wynik:

B
1, A
2, A
3, A
4, A
5, A

Czy istnieje sposób na program, aby B zostanie wydrukowany po AS? Właściwie korzystam z modułu Parsera Feed RSS tutaj, powyżej jest tylko przykładem, aby zilustrować problem.

0
Tee1er 7 październik 2020, 03:37

1 odpowiedź

Najlepsza odpowiedź

Dzwonienie asyncFunction Zwraca obietnicę. Nawet jeśli obietnica rozwiązuje się natychmiast, każdy .then s przykuty na nim zostanie umieszczony w kolejce mikrotask, którego zadania rozpocznie się tylko po zakończeniu wszystkich innych synchroniczne kod.

Ponieważ console.log('B'); biegnie synchronicznie po wywołaniu example, B zostanie wydrukowany przed biegami .then.

Jeśli chcesz być pewien, ponieważ wszystkie elementy tablicy są rejestrowane, zwróć obietnicę asyncFunction, a następnie zadzwoń example, a następnie zadzwoń .then na nim i zaloguj B w tym .then "s Callback:

function asyncFunction() {
    return new Promise(function(resolve, reject) {
        resolve([1, 2, 3, 4, 5])
    })
};

function example() {
    return asyncFunction().then(
        output => {
            for (element of output) {
                console.log(element + ", A") //This should be displayed first
            }
        }
    )
};

example().then(() => {
  console.log('B'); //But it isn't
});
4
CertainPerformance 7 październik 2020, 00:41