javascript - 如何在类中序列化函数的执行 (JS/TS) - 一个“QueueManager”?
我在 TS 中有一个单独的类,用于操作本地存储(也就是 PouchDB)——基本想法是封装对象的存储,这样应用的其他部分就不必担心它(并且如果需要,可以轻松替换它)。
函数例如有:
public addOrUpdateBulk(myValues: Array<DbEntryType>): Promise<boolean>{
//call into pouchdb saving (which does this asynchronously)
}
public getById(id: number): Promise<DbEntryType> {
//get the value from pouchdb...
}
我遇到的问题可以最好地描述为“写后读”(read-your-writes)一致性的丧失——也就是说,调用者必须自己处理,将写入和读取操作链起来才能得到预期的结果。我不能详细说明成千上万行代码的细节,这只是对问题的一个过度简化,但它最能描述问题(实际上,各种读取和写入操作来自各个地方,并且不仅仅由一个“数据拥有者”执行,这会导致更新冲突)。是的,这可以通过小心处理来解决,但我正在寻找一种方法,在一个类中为所有人解决这个问题。
我正在寻找一种设计,以便所有被调用的方法都按调用顺序执行。当然,这会大大减慢所有操作的速度,但目前暂且假设这不是问题。
我想到的是像这样的东西:
public addOrUpdateBulk(myValues: Array<DbEntryType>, isInQueue: boolean = false): Promise<any>{
if (isInQueue){
return call_to_pouchdb_func(...)...
}
else{
return QueueManager.enqueue("writer", addOrUpdateBulk, myValues, true);
}
}
public getById(id: number, isInQueue: boolean = false): Promise<DbEntryType> {
if (isInQueue || !QueueManager.hasAny("writer")){ //no need to queue reads if no writes are going on
return call_to_pouchdb_func(...)...
}
else {
return QueueManager.enqueue("reader", getById, number, true);
}
}
关于设计QueueManager我有些不知所措:
- 如何编写
enqueue函数以最终执行具有未知数量参数的方法? - 使用什么作为排队机制?async.js 有一个很不错的“queue”,看起来很有前途,但因为我在 angular2 中,也许可以链入 Observables?怎么做?
- 将值返回给调用者是我看不出解决方案的主要“痛点”……有任何想法吗?