Przejdź do głównej zawartości

Bug #061

🪲 Znajdź buga

const promise1 = new Promise((resolve) => {
resolve("foo")
})
const promise2 = new Promise((resolve) => {
resolve(promise1)
})

console.log(promise1)
console.log(promise2)

promise2.then((value) => {
console.log(value)
console.log(value === promise1)
})

Mamy 2 obietnice: promise1 rozwiązuje się zwracając wartość foo, a promise2 rozwiązuje się zwracając promise1.

Co zostanie zalogowane do konsoli w poszczególnych miejscach?

Czy rozwiązanie promise2 poprzez then zwróci w value tą samą obietnicę, która została przekazana w resolve()?

🧪 Rozwiązanie

const promise1 = new Promise((resolve) => {
resolve("foo")
})
const promise2 = new Promise((resolve) => {
resolve(promise1)
})

console.log(promise1) // Promise {}
console.log(promise2) // Promise {}

promise2.then((value) => {
console.log(value) // foo
console.log(value === promise1) // false
})

promise1 i promise2 to obiekty Promise, co jest wyraźnie logowane do konsoli w liniach 8 i 9.

promise2, mimo że w założeniu rozwiązuje się do obiektu promise1, finalnie zostaje rozwiązane do wartości foo.

resolve() spłaszcza przekazane obietnice jeśli takie zostają przekazane jako wartość rozwiązania obietnicy i rozwiązuje je wszystkie.

value po rozwiązaniu promise2, będzie więc wartością przekazaną w resolve() w promise1.

value === promise1 zwróci więc fałsz, bo value to foo, a nie obiekt obietnicy promise1.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js