异步支持返回不可链接的 Promise<void> 的函数
Posted
技术标签:
【中文标题】异步支持返回不可链接的 Promise<void> 的函数【英文标题】:Async support for functions that return an unchainable Promise<void> 【发布时间】:2016-12-29 17:29:27 【问题描述】:我们正在测试对返回 Promise<void>
的函数的调用。我们如何才能等到承诺解决并then
做一些测试?
then()
关闭函数的标准方法不起作用,因为 Promise<void>
是不可用的。因此,我们采用了以下方法,虽然可行,但似乎并不理想。
初步方法
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<void> is not thenable
- 在那种情况下听起来不像一个标准的 Promise ... 可以使用的是 core functionality of a Promise - 没有 then
- 这是毫无意义的 - 这样一个还有什么其他目的答应吗?
您可能误解了Promise<void>
的含义。它只是意味着承诺被解决,没有价值(或者价值undefined
,如果你更喜欢这样想的话)。这是一个正常的、可链接的承诺。除非您使用的 Promise 库很奇怪且不符合 A+ 标准?
这些 cmets 中的任何一个是否建议在承诺解决后运行测试而无需包装承诺?无论出于何种原因,@GregL 在Promise<void>
上执行then()
都不起作用。
你使用的是什么承诺库?或者这是使用原生的Promise
?什么版本的茉莉花?
@GregL 这是 TypeScript...我已经更新了标签。
【参考方案1】:
您可以尝试如下更改 wrapUnchainedPromise:
function wrapUnchainedPromise(): Promise<any>
return route.navigationStrategy(instruction);
【讨论】:
恐怕不行,因为Promise<void>
不能分配给Promise<any>
。以上是关于异步支持返回不可链接的 Promise<void> 的函数的主要内容,如果未能解决你的问题,请参考以下文章