.then не взаимодействует с внешней средой
Почему .then не взаимодействует со внешними переменными: при попытке переопределить переменную внутри .then, внутри самого .then она переопределяется, но вне нет.
const promise = new Promise((resolve) => {
resolve(3);
});
let a;
promise.then(val => {
a = val;
console.log(a)
});
console.log(a)
Пытался сделать обходной путь - передавать в .then функцию, которая переопределяет переменную a, но безуспешно:
const promise = new Promise((resolve) => {
resolve(3);
});
let a;
function toRes(val) {
a = val;
}
promise.then(toRes);
console.log(a)
const a = {
get rates() {
fetch('https://blockchain.info/ru/ticker')
.then(rates => {
return rates;
});
}
}
console.log(a.rates);
let res;
fetch('https://blockchain.info/ru/ticker')
.then(rate => {
res = rate;
console.log(res);
});
setTimeout(console.log, 1000, res);
Ответы (1 шт):
Я бы посоветовал вот так пользоваться промисами:
Когда вы подписываетесь на изменения .then, то при срабатывании просто вызываете функцию, которая выполнит ваш код
const promise = new Promise((resolve) => {
resolve(3);
})
.then(res => {
promiseWorked(res);
});
function promiseWorked(res) {
console.log(res);
}
Если вы хотите писать код сверху вниз, можете использовать async/await:
void async function() {
const promise = new Promise((resolve) => {
resolve(3);
});
const promiseRes = await promise;
console.log(promiseRes);
}();
НО, пока не выполнится await, следующая строчка кода не выполнится в async функции, и если сработает ошибка, то мы это не отловим, а также весь код ниже await не выполнится:
void async function() {
const promise = new Promise((resolve, reject) => {
reject(3);
});
const promiseRes = await promise;
console.log(promiseRes);
console.log(11111);
}();
Поэтому, если вы используете await, необходимо пользоваться конструкцией try/catch, чтобы ловить ошибки:
void async function() {
const promise = new Promise((resolve, reject) => {
reject(3);
});
try {
const promiseRes = await promise;
console.log(promiseRes); // Если у промиса сработал resolve, то сработает эта строчка, но мы вызываем reject
} catch (e) {
console.error(e);
}
}();