我需要一个只为模块调用一次的初始化函数。该函数是一个promise,由execute函数调用。如果两次调用execute,则第二次必须等待初始化然后继续执行。
我编写了这段代码,但执行的第二次调用始终在等待,并且永远不会返回。我错过了什么?
Communicator.world.Barrier()
答案 0 :(得分:1)
MATCH (n) WHERE labels(n) IN ['typeX','typeY'] WITH n MATCH (n)-[]-(z) RETURN z
不正确。这不会等待任何事情,它只是从// Wait : initializing in progress
return initializationPromise;
构造函数中删除而没有做任何事情。你似乎也使用了Promise
constructor antipattern。
你应该做的是
q.promise
答案 1 :(得分:0)
已解析/拒绝的promise将保持其状态(已解决或已拒绝状态),因此您只能使用它来运行初始化代码一次。为此,init()
函数应返回始终相同的承诺,而不是每次都创建它。
出于这个原因,我们在initializationDeferred
方法之外创建了一个延迟对象(init()
),每次使用initializationDeferred
返回相同的承诺 {{ 1}}方法被调用。我们还需要检查init()
之前是否已经完成,如果在先前的调用中已经完成,我们使用共享变量init()
跳过initializationStarted
。
现在,在setTimeout
内,您可以确保只有在初始化execute
方法时才会调用{{1>}的 onFulfilled 回调。
then()
init()