Pouchdb同步不会立即将数据保存到远程

时间:2019-06-26 15:23:58

标签: pouchdb

我用远程数据库编写了pouchdb sync(在Angular应用程序中),该数据库将远程更改发送到该应用程序。

根据PouchDb文档,我了解到,应该由PouchDb.sync在本地IndexedDb和远程服务器之间同步数据。之后,它将由第二个客户端获得。

这是我用于同步的代码:

export const appDataDbSyncArgs: IDbSyncArguments = {
    localDbName: "app_data",
    remoteDbUrl: "http://localhost:4984/app_data",    
    syncOptions: {
        live: true,
        retry: true,
        since: 0,
        batch_size: 1,
        batches_limit: 1
    }
};


PouchDB.replicate(remoteDbUrl, localDbName)
        .on("active", () => {
            console.log("replication is active");
            const replicationStartedMessage = applyMessageType({}, replicationStarted);
            messenger.postMessage(replicationStartedMessage);
        })
        .on("complete", info => {
            console.log("%cReplication has been completed.", "color: lightgreen; font-size: 20px;");
            const replicationCompleteMessage = applyMessageType(info, replicationComplete);
            messenger.postMessage(replicationCompleteMessage);

            PouchDB.sync(localDbName, remoteDbUrl, syncOptions)
                .on("change", changeInfo => {
                    console.log("%cSync changes", "color: green; font-size: 20px;");
                    const changesInfoMessage = applyMessageType(changeInfo, syncChanges);
                    messenger.postMessage(changesInfoMessage);
                })
                .on("error", err => {
                    console.log("sync error", err);
                    const errorMessage = applyMessageType(err, syncError);
                    messenger.postMessage(errorMessage);

                })
                .on("paused", err => {
                    console.log("sync error (paused)", err);                

                })
                .on("active", () => {
                    console.log("sync active");

                })
                .on("denied", err => {
                    console.log("sync error (denied)", err);        

                })
                .on("complete", info => {
                    console.log("sync complete", info);                   

                });
        })
        .on("error", err => {
            console.log("replication error", err);
            const replicationErrorMessage = applyMessageType(err, replicationError);
            messenger.postMessage(replicationErrorMessage);
        });

这是我用于保存数据的代码:

protected _addDocument<T> (id: string, document: PutDocument<{} & T>): Observable<Response> {
        document['_id'] = id;
        //document._rev = null;
        return fromPromise(this._db.put<T>(document))
            .pipe(
                take(1) 
            );
    }

// Where this._db = new PouchDB(localDbName);

它立即将数据保存到IndexedDb,但没有将其保存在远程数据库中。有时,数据会在5-10分钟或更长时间后到达远程数据库。有时马上。但是,如果数据来自远程数据库,或者我更改了远程服务器中的数据,则pouchDb会触发“ onChange”事件,第二个客户端将其从应用程序中获取。

但是我需要将IndexedDb中保存的数据立即保存在远程数据库中。

1 个答案:

答案 0 :(得分:1)

这是预期的行为。 CouchDB和扩展名PouchDB最终都是一致的。这意味着跨节点的数据最终可以保证变得一致,但是不能保证速度有多快。您应该牢记这一点来设计应用。

话虽如此,您可以做一些事情来帮助增加更快地复制数据的机会。尤其要注意options for replication in PouchDB

根据您的描述,特别感兴趣的是retryback_off_function选项。如果PouchDB检测到您处于脱机状态,它将在复制之间开始引入最长10分钟的延迟。那可能就是你正在经历的。

您可以考虑禁用重试选项(并在检测到客户端重新联机时手动或以编程方式重新启动复制),或编写自定义的退出功能,以将最大时间限制为您满意的时间