Почему нет «тогда» в асинхронных функциях - PullRequest
0 голосов
/ 03 мая 2018

У меня есть две идентичные функции с точки зрения результата:

const p1 = async () => {
  return 1;
};

const p3 = new Promise((resolve, reject) => {
  resolve(1);
});

console.log(typeof p1.then);
console.log(typeof p3.then);

Я бы ожидал, что оба получат свойство "тогда", но, похоже, они этого не сделают:

enter image description here

Но, тем не менее, intellisense vs-code отмечает их как обещания:

enter image description here

enter image description here

и мы можем даже гарантировать, что тип возвращаемого значения будет таким же, если мы явно укажем p3 :

enter image description here

Теперь я думаю по определению Обещание "тогда в состоянии ", верно? Причина, по которой я забочусь, заключается в том, что у меня в Typescript есть интерфейс из следующей функции:

export const DELAYED = "WAIT_IN_PARALLEL_DELAYED";
export function delayed<T = any>(delayedPromise: () => Promise<T>) {
  return {
    delayed: DELAYED,
    start(resolve, reject) {
      delayedPromise()
        .then(resolve)
        .catch(reject);
    }
  };
}

Я бы подумал передать:

 const test = () => async() => 1;

для функции delayed(test) было бы хорошо, но вместо этого он жалуется, что тест НЕ имеет ".then". Может ли кто-нибудь помочь мне понять недостаток моего мышления?

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Ну, для начала, нет, p1 и p3 не одинаковы. p3 - это Promise, поэтому у него есть метод then. Но p1 - это функция, которая возвращает обещание , так что это не обещание, а функция, и поэтому не имеет свойства then, как в const p4 = () => 5 p4 это функция, а не number.

По сути, ваша функция delayed требует, чтобы вы передали функцию, которая возвращает Promise, хотя я не уверен почему. Не должно быть проще просто передать сам Promise? Но, в любом случае, ваша test функция не соответствует типу delayedPromise. Почему?

Потому что, по вашему определению:

delayedPromise: () => Promise<T> // a function that returns Promise<T>
const test = () => async() => 1; // a function that returns a function that returns a Promise

Вы должны определить test как

const test = async() => 1;

Надеюсь, это поможет вам.

0 голосов
/ 03 мая 2018

Почему в асинхронных функциях нет «тогда»

Асинхронные функции возвращают обещание при вызове (сами они не являются обещаниями). Это обещание имеет свойство then.

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