以下是 TypeScript 中的 Jest 测试。我想知道为什么需要 setImmediate() 。
第一个例子是一个有效的测试。接下来是我尝试过但不起作用的各种事情。我不明白发生了什么事。pubsub.publish 的签名是:
(method) PubSub.publish(triggerName: string, payload: any): Promise<void>
test.only('subscriptions', async () => {
const document = parse(`
subscription {
create
}
`)
const sub = <AsyncIterator<ExecutionResult>>await subscribe(schema, document);
expect(sub.next).toBeDefined()
// setInterval and process.nextTick also work here:
setImmediate(() => pubsub.publish('CREATE_ONE', { create: "FLUM!" })) // this works
const { value: { errors, data } } = await sub.next()
expect(errors).toBeUndefined()
expect(data).toBeDefined()
expect(data.create).toBe('FLUM!')
}, 10000)
Run Code Online (Sandbox Code Playgroud)
这些是我尝试过的其他事情,其中一些是在研究了类似问题的答案之后做出的。所有这些尝试都会失败,并在测试中出现超时异常:
test.only('subscriptions', async () => {
// attempt #1: jest.useFakeTimers()
const …
Run Code Online (Sandbox Code Playgroud) 我一直在阅读有关如何不阻止 Node 的事件循环的内容。避免阻塞的一种方法是使用分区。
我试图在我的代码中使用分区循环,但我似乎无法等待我的循环。这是我的代码的简化版本:
const report = {
someValue: 0
};
const runLoop = async () => {
report.someValue += 1;
// all sorts of async operations here that use async-await
if (report.someValue < 1000) {
await setImmediate(runLoop);
}
};
await runLoop();
console.log('Report is', report);
Run Code Online (Sandbox Code Playgroud)
这会返回“Report is { someValue: 1 }”,但我希望 someValue 为 1000。
我猜 setImmediate 不会返回承诺,所以我尝试承诺它:
const setImmediatePromise = util.promisify(setImmediate);
const report = {
someValue: 0
};
const runLoop = async () => {
report.someValue += 1; …
Run Code Online (Sandbox Code Playgroud) 有人可以解释一下 Nodejs 中 setImmediate() 函数的实时用例吗?我已经浏览了很多博客,但每个地方都给出了 console.log 使用 setImmediate 的示例。