【问题标题】:Async support for functions that return an unchainable Promise<void>异步支持返回不可链接的 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...我已经更新了标签。

标签: javascript typescript jasmine promise


【解决方案1】:

您可以尝试如下更改 wrapUnchainedPromise:

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

【讨论】:

  • 恐怕不行,因为Promise&lt;void&gt;不能分配给Promise&lt;any&gt;
猜你喜欢
  • 2021-08-24
  • 2020-07-09
  • 2017-10-16
  • 1970-01-01
  • 2018-04-13
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多