36 lines
1.1 KiB
TypeScript
36 lines
1.1 KiB
TypeScript
/**
|
||
* 功能:缓存一次资源保存流程中已经完成的头像上传结果。
|
||
* 版本:v1.0.0
|
||
*/
|
||
|
||
export type AvatarUpload = (file: File) => Promise<{ uri: string }>;
|
||
|
||
/** 创建头像上传缓存;选择新文件或清除头像时由调用方主动重置。 */
|
||
export function createAvatarUploadCache(upload: AvatarUpload) {
|
||
let cachedFile: File | undefined;
|
||
let cachedURI: Promise<string> | undefined;
|
||
|
||
/** 返回当前文件的受控资源地址;同一文件重试时复用首次成功结果。 */
|
||
async function resolve(file: File) {
|
||
if (cachedFile !== file || !cachedURI) {
|
||
cachedFile = file;
|
||
cachedURI = upload(file)
|
||
.then((result) => result.uri)
|
||
.catch((error) => {
|
||
// 上传本身失败时清空缓存,允许用户直接重试。
|
||
if (cachedFile === file) cachedURI = undefined;
|
||
throw error;
|
||
});
|
||
}
|
||
return cachedURI;
|
||
}
|
||
|
||
/** 清空已上传地址,确保新选择的文件不会错误复用旧头像。 */
|
||
function reset() {
|
||
cachedFile = undefined;
|
||
cachedURI = undefined;
|
||
}
|
||
|
||
return { resolve, reset };
|
||
}
|