Я пытаюсь обернуть голову невероятно запутанными темами Обещаний в Javascript.
Одно из сомнений, с которыми я столкнулся, заключается в том, что происходит, когда обратный вызов then()
фактически возвращает обещание.
Посмотрите на приведенный ниже код, взятый из javascript.info
new Promise(function(resolve, reject) {
setTimeout(() => resolve(1), 1000);
}).then(function(result) {
alert(result); // 1
//Actually resolves before calling the next then()
return new Promise((resolve, reject) => { // (*)
setTimeout(() => resolve(result * 2), 1000);
});
}).then(function(result) { // (**)
alert(result); // 2
return new Promise((resolve, reject) => {
setTimeout(() => resolve(result * 2), 1000);
});
}).then(function(result) {
alert(result); // 4
});
Любое из внутренних обещаний фактически выполняется перед переходом к следующему оператору then.
Почему это?Как Javascript узнает, когда возвращаемое значение является самим обещанием?
Есть ли действительно проверка в интерпретаторе JS для этого?Примерно так:
if(ret_value instanceof Promise) {
wait_for_promise(ret_value);
}
На самом деле это не имеет смысла интуитивно.Можно подумать, что возвращаемое значение будет сохранено как есть, то есть следующее then()
в цепочке получит обещание, а не результат обещания.
Я пришел отЯвский фон, который, вероятно, поэтому меня раздражает эта свободная типизация.