Значит, вы что-то неправильно поняли об обещаниях. Они предназначены для использования в асинхронном коде, например:
let p = new Promise(resolve => setTimeout(resolve, 1000, 'here'))
p.then(console.log)
//in one second 'here'
Как вы можете видеть, что на самом деле не произойдет, пока ПОСЛЕ обещания не разрешится. С асинхронным кодом, который вызывается каждый раз, когда решается.
То, что происходит в вашем коде, выглядит следующим образом:
Create Promise -> set event loop callback
console.log(isBound) // false, but happens first because it's called sync
Promise resolves // true
так что действительно в вашем обещании разрешение - это первое место, где вы даже сможете успешно его проверить. Если вы ответите на вызов, вы сможете подключиться к нему и убедиться, что область действия будет продолжена позже.
let a = 0
let p = Promise.resolve(a)
.then(a =>{
a += 2;
return a;
})
.then(a => console.log(a) || a)
console.log(a) // 0
p == p.then(a =>{
a += 4;
return a;
})
.then(console.log) // false because promises aren't equal and .then/.catch return new promise chains
// 2
// 6
2,6 и ложное сравнение могут выводиться не по порядку из-за цикла событий, однако, если вы сохраните все это в одной и той же лексической области, тогда у вас все равно будет доступ к a
или this
в пределах границы вашей цепочки обещаний.
Примечание: вам не нужно ссылаться на _this
против this
с функцией стрелки внутри методов класса. Они будут иметь лексическую область видимости, и, таким образом, это будет связано с локальной областью действия этой функции. Более подробную информацию можно найти на Вы не знаете JS