异步支持返回不可链接的 Promise<void> 的函数

Posted

技术标签:

【中文标题】异步支持返回不可链接的 Promise<void> 的函数【英文标题】:Async support for functions that return an unchainable Promise<void> 【发布时间】:2016-12-29 17:29:27 【问题描述】:

我们正在测试对返回 Promise&lt;void&gt; 的函数的调用。我们如何才能等到承诺解决并then 做一些测试?

then() 关闭函数的标准方法不起作用,因为 Promise&lt;void&gt; 是不可用的。因此,我们采用了以下方法,虽然可行,但似乎并不理想。

初步方法

it("it does something...", function (done) 

    function wrappedPromise() 
        functionThatReturnsPromiseVoid(someArg);
        return new Promise((resolve) => resolve());
    

    wrappedPromise()
        .then(() => 
            expect(someVar).toBe("someValue");
            done();
        );
);

后续方法

let wrapVoidPromise = (wrapped): Promise<any> => new Promise((resolve) => 
    wrapped();
    resolve();
);

it("it does something...", function (done) 

    wrapVoidPromise(() => functionThatReturnsPromiseVoid(someArg))
        .then(() => 
            expect(someVar).toBe("someValue");
            done();
        );
);

我们如何在不需要包装不可链接的承诺的情况下做到这一点?

编辑

这是GitHub link to the actual test。它包括这个调用:

route.navigationStrategy(instruction) // returns Promise<void>

这是GitHub link to the function。该实现被隐藏在 aurelia-router 的源内部某处。这是它的界面:

navigationStrategy?: (instruction: NavigationInstruction) => Promise<void>|void;

【问题讨论】:

a Promise&lt;void&gt; is not thenable - 在那种情况下听起来不像一个标准的 Promise ... 可以使用的是 core functionality of a Promise - 没有 then - 这是毫无意义的 - 这样一个还有什么其他目的答应吗? 您可能误解了Promise&lt;void&gt; 的含义。它只是意味着承诺被解决,没有价值(或者价值undefined,如果你更喜欢这样想的话)。这是一个正常的、可链接的承诺。除非您使用的 Promise 库很奇怪且不符合 A+ 标准? 这些 cmets 中的任何一个是否建议在承诺解决后运行测试而无需包装承诺?无论出于何种原因,@GregL 在Promise&lt;void&gt; 上执行then() 都不起作用。 你使用的是什么承诺库?或者这是使用原生的Promise?什么版本的茉莉花? @GregL 这是 TypeScript...我已经更新了标签。 【参考方案1】:

您可以尝试如下更改 wrapUnchainedPromise:

function wrapUnchainedPromise(): Promise<any> 
      return route.navigationStrategy(instruction);     

【讨论】:

恐怕不行,因为Promise&lt;void&gt;不能分配给Promise&lt;any&gt;

以上是关于异步支持返回不可链接的 Promise<void> 的函数的主要内容,如果未能解决你的问题,请参考以下文章

手写promise

Egret之异步JSZIP操作

return Promise.resolve

useState 与异步函数返回 Promise <pending>

异步函数的返回类型必须是全局 Promise<T> 类型

为啥我的异步函数返回 Promise <pending> 而不是一个值?