Async / await не работает должным образом - PullRequest
0 голосов
/ 26 июня 2018

Я написал этот код на основе моего понимания Async / await и того, как он работает. В основном я хочу, чтобы моя функция run() ожидала установки значения captcha, нажав кнопку и функцию set_captcha, а затем запустила оставшуюся часть кода.

var captcha = false ;

function get_captcha() {
  return new Promise(function(resolve , reject ) {
    if(captcha === false ){
      reject(captcha );
    } else {
      resolve(captcha);
    }
  });
}

async function run() {
  var captcha = await get_captcha();
  console.log( ' captcha confirm -> ' + captcha );
}

run().then(function(){ console.log('done')});

function set_captcha(){
  captcha = 123;
}

</script>
<button type="button" onclick="set_captcha();">captcha</button>

но, очевидно, я что-то упустил. Когда я запускаю код, я получаю эту ошибку в консоли:

Uncaught (in promise) false

и когда я нажимаю кнопку и звоню set_captcha(), ничего не происходит.

1 Ответ

0 голосов
/ 26 июня 2018

Вы можете думать об async / await больше как о синтаксическом сахаре, который использует обещания.

Если функция async, это означает, что она всегда возвращает обещание. По этой причине вы можете ожидать только в методе async - поскольку он всегда остается в цепочке обещаний, он может возвращать вам значение внутри асинхронной функции. Однако, когда вы возвращаете что-то из этой функции, его всегда обещают снова.

То же, что и для обещаний - как только вы окажетесь в цепочке обещаний, вы не сможете получить значение «вне обещания» (как вы можете сохранить его в некоторой глобальной переменной, но вы не можете вернуть значение непосредственно из цепочки - вы можете вернуть только обещание, которое можно разрешить с помощью значения).

Вы можете переписать любую асинхронную функцию, чтобы обещать цепочки и наоборот

Эта функция:

async function run() {
    var captcha = await get_captcha();
    console.log( ' captcha confirm -> ' + captcha );
}

равно этому:

function run() {
    return get_captcha().then(captcha => {
       console.log( ' captcha confirm -> ' + captcha );
    });
}

Ошибка: вначале капча имеет значение false, поэтому вы отклоняете обещание на if(captcha === false ) reject(captcha ); со значением false и не перехватываете его, которое заканчивается на Uncaught (in promise) false

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...