我正在尝试包装Ionic File.moveTo,以便它可以是可观察的。它具有以下签名
moveTo(parent: DirectoryEntry, newName?: string, successCallback?: EntryCallback, errorCallback?: ErrorCallback): void;
但是bindCallback只期望回调成功。我正在尝试这个,但我似乎无法让它工作
const movedFile$ = bindCallback(fileEntry.moveTo).call(this.file.tempDirectory, fileEntry.name + "_scaled.jpg") as Observable<Entry>;
我认为您可以使用bindNodeCallback
。它的回调函数将错误作为第一个参数。
(...results: any[]) => {
if (isNodeStyle) {
const err = results.shift();
if (err != null) {
subject.error(err);
return;
}
正如您所看到的,如果发生错误,您将能够在error
回调中截获该错误。
在这种情况下,我会考虑使用Observable
构造函数来创建一个新的Observable,用于管理成功和错误回调。
我不知道IonicFile.moveTo
函数是如何工作的,但我已经用这种技术包装了签名为的node
fs
readdir
函数
readdir(path: fs.PathLike, options: {
encoding?: string;
withFileTypes: true;
}, callback: (err: NodeJS.ErrnoException, files: fs.Dirent[]) => void): void
在这种情况下,包装器函数返回一个Observable,它会在发生错误时发出目录中文件或错误的列表。包装功能的代码是这个
function dirNamesListObs(fromDirPath: string) {
return new Observable(
(observer: Observer<string[]>): TeardownLogic => {
readdir(fromDirPath, { withFileTypes: true }, (err, files) => {
if (err) {
observer.error(err);
return;
}
const dirs = files.filter(f => f.isDirectory()).map(d => d.name);
observer.next(dirs);
observer.complete();
});
},
);
}
在你的情况下,包装代码可能看起来像这个
function moveToObs(parent: DirectoryEntry, newName?: string) {
return new Observable(
(observer: Observer<any>): TeardownLogic => {
moveTo(
parent,
newName,
res => {
observer.next(res);
observer.complete();
},
err => observer.error(err)
)
}
);
}
bindCallback
和bindNodeCallback
可能不太适合这种情况,因为这两个函数都希望用一个回调来包装函数,而在您的情况下,您必须处理两个回调。