如何将bindCallback与包含成功和错误回调的函数一起使用



我正在尝试包装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函数是如何工作的,但我已经用这种技术包装了签名为的nodefsreaddir函数

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)
)
}
);
}

bindCallbackbindNodeCallback可能不太适合这种情况,因为这两个函数都希望用一个回调来包装函数,而在您的情况下,您必须处理两个回调。

最新更新