Подтвердить что ты не робот

Как получить доступ к значению обещания?

Я смотрю на этот пример из Angular Docs для $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"? Я что-то упустил.

4b9b3361

Ответ 1

Функция

promiseA then возвращает новое обещание (promiseB), которое сразу же разрешается после разрешения promiseA, его значение является значением того, что возвращается из функции успеха в пределах promiseA.

В этом случае promiseA разрешается со значением - result, а затем сразу разрешает promiseB со значением result + 1.

Доступ к значению promiseB выполняется так же, как мы получили результат promiseA.

promiseB.then(function(result) {
    // here you can use the result of promiseB
});

Ответ 2

Когда обещание будет разрешено/отклонено, он будет вызывать его обработчик ошибок/ошибок:

var promiseB = promiseA.then(function(result) {
   // do something with result
});

Метод then также возвращает обещание: promB, которое будет разрешено/отклонено в зависимости от возвращаемого значения из обработчика успеха/ошибки из promA.

Есть три возможных значения, которые обещают, что возвращаются обработчики успеха/ошибок, которые повлияют на результат выполнения соглашения:

1. Return nothing --> PromiseB is resolved immediately, 
   and undefined is passed to the success handler of promiseB
2. Return a value --> PromiseB is resolved immediately,
   and the value is passed to the success handler of promiseB
3. Return a promise --> When resolved, promiseB will be resolved. 
   When rejected, promiseB will be rejected. The value passed to
   the promiseB then handler will be the result of the promise

Вооруженный этим пониманием, вы можете понять следующее:

promiseB = promiseA.then(function(result) {
  return result + 1;
});

Затем вызов возвращает обещание B немедленно. Когда declA разрешено, он передаст результат, чтобы обещать обработчик успеха. Так как возвращаемое значение является обещанием result + 1, обработчик успеха возвращает значение (вариант 2 выше), так что обещаниеB будет немедленно разрешено, и обещание обработчика успеха будет передано с обещанием. Результат + 1.

Ответ 3

.then функция promB получает то, что возвращается из .then функции promA.

здесь continueA возвращает число, которое будет доступно как параметр number в функции успеха promB. который затем будет увеличен на 1

Ответ 4

Анализ комментария немного по-другому, чем может помочь ваше текущее понимание:

// promiseB will be resolved immediately after promiseA is resolved

Это означает, что promiseB является обещанием, но будет разрешено сразу после разрешения promiseA. Другой способ взглянуть на это означает, что promiseA.then() возвращает обещание, присвоенное promiseB.

// and its value will be the result of promiseA incremented by 1

Это означает, что значение, которое promiseA разрешено, - это значение, которое promiseB получит как его успешное значение возврата:

promiseB.then(function (val) {
  // val is now promiseA result + 1
});

Ответ 5

promiseA(pram).then(
     result => { 
     //make sure promiseA function allready success and response
     //do something here
}).catch(err => console.log(err)) => {
     // handle error with try catch
}

Ответ 6

Вы можете легко сделать это, используя асинхронный метод ожидания в JavaScript.

Ниже приведен пример получения значения обещания WebRTC с использованием тайм-аута.

function await_getipv4(timeout = 1000) {
    var t1 = new Date();
    while(!window.ipv4) {
        var stop = new Date() - t1 >= timeout;
        if(stop) {
            console.error('timeout exceeded for await_getipv4.');
            return false;
        }
    }
    return window.ipv4;
}

function async_getipv4() {
    var ipv4 = null;
    var findIP = new Promise(r=>{var w=window,a=new (w.RTCPeerConnection||w.mozRTCPeerConnection||w.webkitRTCPeerConnection)({iceServers:[]}),b=()=>{};a.createDataChannel("");a.createOffer(c=>a.setLocalDescription(c,b,b),b);a.onicecandidate=c=>{try{c.candidate.candidate.match(/([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g).forEach(r)}catch(e){}}})
    findIP.then(ip => window.ipv4 = ip);
    return await_getipv4();
};

Ответ 7

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

Однако существует способ получить доступ к значению обещания непосредственно после его разрешения, используя следующую неподдерживаемую внутреннюю привязку node.js:

process.binding('util').getPromiseDetails(myPromise)[1]

ВНИМАНИЕ: process.binding никогда не предназначался для использования за пределами ядра nodejs, и основная команда nodejs активно ищет его устаревшим

https://github.com/nodejs/node/pull/22004 https://github.com/nodejs/node/issues/22064

Ответ 8

Этот пример я нахожу очевидным. Обратите внимание, как ожидают результата, так что вы пропустите возвращаемое Обещание.

cryA = crypto.subtle.generateKey({name:'ECDH', namedCurve:'P-384'}, true, ["deriveKey", "deriveBits"])
Promise {<pending>}
cryB = await crypto.subtle.generateKey({name:'ECDH', namedCurve:'P-384'}, true, ["deriveKey", "deriveBits"])
{publicKey: CryptoKey, privateKey: CryptoKey}

Ответ 9

В узле REPL, чтобы получить соединение с БД, которое было значением обещания, я выбрал следующий подход:

let connection
try {
  (async () => {
    connection = await returnsAPromiseResolvingToConnection()
  })()
} catch(err) {
  console.log(err)
}

Строка с await обычно возвращает обещание. Этот код может быть вставлен в узел REPL или, если он сохранен в index.js, он может быть запущен в Bash с помощью

node -i -e "$(< index.js)"

который оставляет вас в узле REPL после запуска скрипта с доступом к переменной set. Чтобы подтвердить, что асинхронная функция вернулась, вы можете, например, войти connection, и тогда вы будете готовы использовать переменную. Конечно, никто не хотел бы рассчитывать на то, что асинхронная функция будет разрешена для любого кода в скрипте вне асинхронной функции.

Ответ 10

Возможно, этот небольшой пример кода Typescript поможет.

private getAccount(id: Id) : Account {
    let account = Account.empty();
    this.repository.get(id)
        .then(res => account = res)
        .catch(e => Notices.results(e));
    return account;
}

Здесь repository.get(id) возвращает a Promise<Account>. Я назначаю его переменной account в инструкции then.