0

Когда я запускаю скрипт (см. ниже) с первой попытки не удается получить результат,

переменная "result" выводит "underfined"

var result;
Promise.resolve('information')
    .then(res => {return result=res})
    result;

Попытка №1

Посмотреть результат №1

Со второй попытки уже присваивается значения

Посмотреть результат №2

Вопрос: Как ожидать присвоения значения переменной "result", без использования setTimout-ов. Сгодится цикл while или MutationObserver, но у меня не получается. Можете подсказать где у меня ошибка?

Важное условия "console.log" использовать нельзя!

Ожидание с помощью цикла While

var result;
var finito = false;
Promise.resolve('information')
    .then(res => {return result=res})

while(finito != true) { if (result != undefined) { result; finito=true; } }


Дополнение:

let promise = Promise.resolve('information');
promise.then(handler);
function handler(data) {
  return data;
}

Посмотреть результат №3

2 Answers2

1

let promise = Promise.resolve('information');

promise.then(handler);

function handler(data) { console.log(data); }

  • прошу прощения, забыл указать что необходимо без использования console.log, пример как у меня на скрипте – Vlad Yorkyee May 07 '22 at 11:35
  • А какая разница. Консоль я указал только для того, чтобы показать, что прилетает "приготовленная" переменная. В функции может быть любая обработка данных – Алексей Шиманский May 07 '22 at 11:38
  • покажите пожалуйста пример без console.log-а очень вас прошу, уже вторую неделю голову ломаю никак не получается – Vlad Yorkyee May 07 '22 at 11:42
  • Вместо вывода в консоль напишите ЛЮБОЙ код, который работает с результатом. – Алексей Шиманский May 07 '22 at 12:09
  • Вверху, я добавил дополнение, пожалуйста посмотрите результаты – Vlad Yorkyee May 07 '22 at 12:18
  • Зачем return в handler, если там должна быть обработка результата, который возвращает promise? – Алексей Шиманский May 07 '22 at 12:34
  • то как я записал, это потому что мне нужно что то подобное этому, это для отправки скрипта в cefSharp, cefSharp не принимает console.log, поэтому мне нужно что то подобное, как я показал в своих примерах. Главное - вывести информацию так как я показал в последнем скриншоте – Vlad Yorkyee May 07 '22 at 12:38
  • "Главное - вывести информацию так как я показал в последнем скриншоте" --- ровно это и происходит в коде в ответе – Алексей Шиманский May 07 '22 at 12:43
  • А что надо использовать? Тебе вывести надо. Информация выводится. Что не так? Сформулируй нормально что ты хочешь. – Алексей Шиманский May 07 '22 at 12:49
  • Уважаемый, я этот скрипт вставлю в cefSharp, cefSharp не выводит данные которые записаны в console.log, поэтому мне нужно вывести так как я писал в своих примерах или на подобие этого лишь бы не использовать console.log и setTimeout. Лучше всего методом return переменная или просто указав саму переменную как у меня в примерах – Vlad Yorkyee May 07 '22 at 12:56
0

Ошибка в том, что не понимаешь как устроен Event Loop и соответственно - как работает JS Runtime.

Код

var result;
Promise.resolve('information')
        .then(res => {return result=res})
        result;

обработается вовсе не последовательно. Сначала выполнятся строки 1, 2 и 4 и только после этого - строка 3.

  • А как сделать чтобы выполнился 1,2,3,4? – Vlad Yorkyee May 07 '22 at 12:24
  • Обработчик Promise .then(res => {return result=res}) запустится ПОСЛЕ окончания работы скрипта. Именно поэтому у тебя не получится вывести содержимое переменной result со значением 'information': на момент окончания работы скрипта переменная не проинициализирована (равна undefined) – Marat Maksumov May 07 '22 at 12:38