.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);
  }
}();

→ Ссылка