如何使用promises创建初始化函数?

时间:2017-03-21 15:52:11

标签: javascript promise q

我需要一个只为模块调用一次的初始化函数。该函数是一个promise,由execute函数调用。如果两次调用execute,则第二次必须等待初始化然后继续执行。

我编写了这段代码,但执行的第二次调用始终在等待,并且永远不会返回。我错过了什么?

Communicator.world.Barrier()

2 个答案:

答案 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()