dvContext.Data.remove(data) 只是一个错字?应该是 dContext.Datas.remove(data);
JayData 的一些函数是同步的,而其他方法是异步的,但以一种合乎逻辑的方式 :) 当 JayData 接触本地数据库或通过网络调用远程方法时,这些函数是异步的。让我们看看你的代码:
dContext.Datas
是一个过滤器(可查询),它选择所有记录,只要您只是构建过滤器,调用就会同步,所以
dContext.Datas.filter().take().skip().orderBy().map()
只是在内存中建立过滤器,什么都不做,所以它们都是同步的,然后:
dContext.Datas.toArray()
toArray 触发真正的动作,执行查询,这里我们必须接触本地数据库,所以它是异步的,当它完成时,它可以调用回调函数或解析它之前返回的承诺。
这同样适用于删除,它只是将记录放入一个集合中(因此它是同步的),而 saveChanges() 会完成真正的工作(它是异步的)。
恕我直言,您的问题是您的 toArray 既有回调函数又有 then 分支,因此两者都将被并行调用,而 then 分支不会等待回调完成。解决方案:
dContext.Datas.toArray()
.then(function(data) {
// your removes in a loop
// important: return the promise
return dContext.saveChanges();
})
.then(function() {
// whatever
})