Я смотрю на этот пример из документации Angular, $q
но думаю, что это, вероятно, относится к обещаниям в целом. Приведенный ниже пример дословно скопирован из документации с включенным комментарием:
promiseB = promiseA.then(function(result) {
return result + 1;
});
// promiseB will be resolved immediately after promiseA is resolved and its value
// will be the result of promiseA incremented by 1
Мне не понятно, как это работает. Если я могу вызвать .then()
результат первого .then()
, связать их, что, как я знаю, могу, тогда promiseB
это объект обещания, типа Object
. Это не Number
. Так что же они понимают под «его значением будет результат обещания А, увеличенного на 1»?
Я должен получить доступ к этому как promiseB.value
или что-то подобное? Как обратный вызов может вернуть обещание и вернуть «результат + 1»? Я что-то упустил.
javascript
angularjs
promise
angular-promise
temporary_user_name
источник
источник
Ответы:
promiseA
«Sthen
функция возвращает новое обещание (promiseB
) , который сразу же после того, как разрешенноеpromiseA
будет решена, его значение является значением из того, что возвращается из функции успеха вpromiseA
.В этом случае
promiseA
разрешается со значением,result
а затем сразу же разрешаетсяpromiseB
со значениемresult + 1
.Доступ к значению
promiseB
осуществляется так же, как и к результатуpromiseA
.Изменить декабрь 2019 года :
async
/await
теперь стандарт в JS, что позволяет использовать синтаксис, альтернативный подходу, описанному выше. Теперь вы можете написать:Теперь нет обещания B, потому что мы развернули результат от использования обещания A
await
, и вы можете работать с ним напрямую.Однако
await
может использоваться только внутриasync
функции. Таким образом, чтобы немного уменьшить масштаб, вышеприведенное должно содержаться примерно так:источник
Когда обещание разрешено / отклонено, оно вызовет свой обработчик успеха / ошибки:
then
Метод также возвращает обещание: promiseB, который будет разрешен / отвергнутым в зависимости от возвращаемого значения из обработчика успеха / ошибок из promiseA .Есть три возможных значения, которые могут возвращать обработчики success / error в Proma, что повлияет на результат обещания B:
Вооружившись этим пониманием, вы можете понять следующее:
Вызов then немедленно возвращает обещание B. После того, как PromiseA будет решен, он передаст результат обработчику успеха обещания. Так как возвращаемое значение - результат + 1 PromiseA, обработчик успеха возвращает значение (опция 2 выше), так что promIBB разрешится немедленно, и обработчику успеха обещания B будет передан результат Proma + 1.
источник
.then
Функция обещания B получает то, что возвращается из.then
функции обещания.здесь обещание, которое возвращает обещание: число, которое будет доступно в качестве
number
параметра в функции успеха обещания. который затем будет увеличен на 1источник
Анализ комментария может немного отличаться от вашего текущего понимания:
Это
promiseB
означает, что это обещание, но оно будет решено сразу послеpromiseA
разрешения. Другой способ посмотреть на это означает, чтоpromiseA.then()
возвращает обещание, которое назначеноpromiseB
.Это означает, что
promiseA
разрешенное значение является значением,promiseB
которое получит в качестве значения successCallback:источник
Ответ pixelbits правильный, и вы всегда должны использовать его
.then()
для доступа к значению обещания в производственном коде.Однако существует способ получить доступ к значению обещания непосредственно после его разрешения, используя следующую неподдерживаемую внутреннюю привязку node.js:
ВНИМАНИЕ: process.binding никогда не предназначался для использования за пределами ядра nodejs, и основная команда nodejs активно ищет его устаревшим
https://github.com/nodejs/node/pull/22004 https://github.com/nodejs/node/issues/22064
источник
Этот пример я нахожу очевидным. Обратите внимание, как ожидают результата, и вы пропустите возвращаемое Обещание.
источник
источник
Вы можете легко сделать это, используя асинхронный метод ожидания в JavaScript.
Ниже приведен пример получения значения обещания WebRTC с использованием тайм-аута.
источник
В узле REPL, чтобы получить соединение с БД, которое было значением обещания, я выбрал следующий подход:
Строка с
await
обычно возвращает обещание. Этот код может быть вставлен в узел REPL или, если сохранен вindex.js
нем, может быть запущен в Bash скоторый оставляет вас в узле REPL после запуска скрипта с доступом к переменной set. Чтобы подтвердить, что асинхронная функция вернулась, вы можете войти,
connection
например, и тогда вы будете готовы использовать переменную. Конечно, никто не хотел бы рассчитывать на то, что асинхронная функция будет разрешена для любого кода в сценарии за пределами асинхронной функции.источник
Есть несколько хороших ответов выше, и вот версия функции стрелки ES6
источник
Я медленно изучаю обещания JavaScript, по умолчанию все асинхронные функции возвращают обещание, вы можете обернуть свой результат следующим образом:
« Выражение await заставляет выполнение асинхронной функции приостанавливаться до тех пор, пока не будет выполнено обещание (то есть выполнено или отклонено), и возобновить выполнение асинхронной функции после выполнения. При возобновлении значение выражения await совпадает со значением выполненного обещания. Если обещание отклонено, выражение await выбрасывает отклоненное значение. . "
Узнайте больше об ожидании и обещаниях в MDN Web Docs
источник
Возможно, этот небольшой пример кода Typescript поможет.
Здесь
repository.get(id)
возвращаетсяPromise<Account>
. Я назначаю это переменнойaccount
вthen
заявлении.источник