我使用 nexus graphql 框架创建了超级简单的应用程序。
第一步是这样的:
https://www.nexusjs.org/#/tutorial/chapter-1-setup-and-first-query
我api/app.ts
输入了代码:
const uid = require('uid')
let i = 0;
const sleep = async (ms: number) => {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms)
})
}
const recurrenceFunction = async (id:string): Promise<void> => {
i++;
console.log(id, i);
await sleep(2000);
return recurrenceFunction(id)
}
const startQueue = () => {
const id:string = uid();
return recurrenceFunction(id)
}
(async () => {
return startQueue()
})()
唯一的依赖是uid
生成唯一键。
当我使用 ts-node 运行它时,我可以看到:
所以我们可以看到:
- 一旦队列开始。
- 有一个队列。
- 它可以正常工作。
但是当我nexus
通过命令运行这段代码时,nexus dev
我看到了:
所以:
- 两个队列开始了。
- 它们同时运行。
- 他们有独立创建的变量
i
。
问题:
- 有人遇到这个问题吗?
- 我应该如何更改我的代码以获得像 in 中的单个队列
ts-node
? - 或者也许它是错误的
nexus
?
更新:
我检查了版本是否存在此问题> =0.21.1-next.2
在0.21.1-next.1
应用程序中运行一次。
重现步骤:
nexus dev
npm i nexus@0.21.1-next.1
nexus dev
npm i nexus@0.21.1-next.2
有提交引入了这种行为:
https://github.com/graphql-nexus/nexus/commit/ce1d45359e33af81169b7ebdc7bee6718fe313a8
有类似但没有参考文档的onMainThread
变量REFLECTION_ENV_VAR
。我无法理解这段代码在做什么?
这可能会在未来记录在这个地方:
https://www.nexusjs.org/#/architecture?id=build-flow
但现在有:
更新 2
我找到了解决方法:
const xid = uid();
let limit=10;
const onApplicationStart = async (cb: () => any):Promise<any> => {
console.log("can i start?", xid, limit, app.private.state.running);
if(app.private.state.running) {
await cb()
return;
}
limit--;
if(limit <= 0) return ;
await sleep(100);
return onApplicationStart(cb);
}
(async () => {
return onApplicationStart(async () => {
return startQueue()
})
})()
但这只是暂时的破解而不是解决方案。完整示例: