为什么没有"然后"在异步函数中

时间:2018-05-03 00:53:05

标签: typescript async-await

我在结果方面有两个相同的功能:

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

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

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

我原本预计两者都会转变为#34;然后"财产,但似乎他们没有:

enter image description here

但是vs-code的intellisense指出它们都是承诺:

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)会好的,但是它抱怨测试没有&#34; .then&#34;。有人能帮助我理解我思考的缺陷吗?

2 个答案:

答案 0 :(得分:4)

嗯,首先,不,p1p3不一样。 p3Promise,因此它有一个then方法。但是p1是一个函数,它返回一个promise ,所以它不是一个promise,而是一个函数,因此没有then属性,就像在{ {1}} 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

希望这会对你有所帮助。

答案 1 :(得分:1)

  

为什么异步函数中没有“then”

异步函数在调用时返回一个承诺(它们本身不是承诺)。该承诺具有then属性。