私はtypescriptでWeb Audio APIを試しています。私はAudioDownloader
クラスを作成して、1つまたは複数のオーディオファイルのオーディオデータをダウンロードし、1つまたは複数の約束を返します。複数のオーディオファイルをダウンロードする場合、私はPromise.all
が単一の失敗のために失敗するのを避けたいので、reflect
(ネットから借りたもの)というメソッドを使用しました。タイプコピーの約束
何らかの理由により、戻りコードの型が一致しないため、download
メソッドで型コピーのコンパイルが失敗します。私は運がない最後の2日間これを整理しようとしてきました。私はここで何をしているのか分かりません。誰かが助けてくれますか?
class PromiseResult<T> {
value: T;
error?: any;
status: PromiseStatus;
}
enum PromiseStatus {
Resolved,
Rejected
}
function reflect<T>(promise: Promise<T>): Promise<PromiseResult<T>> {
return promise.then(v => {
return { status: PromiseStatus.Resolved, value: v };
}, e => {
return { status: PromiseStatus.Rejected, error: e }
});
}
type AudioDownloadResult = PromiseResult<AudioBuffer>;
class AudioDownloader {
private readonly context: AudioContext;
constructor(context: AudioContext) {
this.context = context;
}
download(urls: string | Array<string>): Promise<AudioDownloadResult | Array<AudioDownloadResult>> {
if (typeof urls === 'string') {
return reflect(this.downloadOne(urls as string));
}
return Promise.all((<Array<string>>urls).map(this.downloadOne).map(reflect));
}
private downloadOne(url: string): Promise<AudioDownloadResult> {
return new Promise((resolve, reject) => {
const req = new XMLHttpRequest();
req.open('GET', url, true);
req.responseType = 'arraybuffer';
req.addEventListener('load',() => {
this.context.decodeAudioData(req.response).then(buffer => {
resolve(buffer);
}, reject);
}, false);
req.addEventListener('error', reject, false);
req.send();
});
}
}
戻り値の型が 'downloadOne'メソッドの' Promise'で 'Promise 'ではありません –
VJAI