Sua*_*cak 8 observable async-await typescript ionic-framework angular
我尝试为我的 Ionic 应用程序构建图像缓存服务。
<ion-col [routerLink]="['/category-detail',cat.objectId,i]" class="category-item"
*ngFor="let cat of categories;index as i" size="3">
<ion-img class="cat-image" [src]="getImage(cat.image.url) | async">
</ion-img>
<p class="cat-name">
{{cat.name}}
</p>
</ion-col>
Run Code Online (Sandbox Code Playgroud)
我从 ion-image 中的 src 标签调用该函数
async getImage(fileUrl: any) {
return await this.cacheService.checkFile(fileUrl);
}
Run Code Online (Sandbox Code Playgroud)
该函数检查文件是否存在,返回文件的 URL,否则返回参数中的 URL
public async checkFile(fileUrl) {
let stringURL = String(fileUrl);
let fileName = stringURL.split('//')[1].replace(/\//g, '-');
return this.file.checkFile(this.file.tempDirectory, fileName)
.then(
async result => {
if (result) {
return this.file.tempDirectory + fileName;
} else {
return fileUrl;
}
}
)
.catch(
async err => {
//FileError.NOT_FOUND_ERR
if (err.code == 1) {
let fileTransfer: FileTransferObject = this.transfer.create();
return fileTransfer.download(fileUrl, this.file.tempDirectory + fileName, true)
.then(
result => {
console.log(result);
return result;
}
)
.catch(
error => {
throw error;
}
)
} else {
throw err;
}
}
)
}
Run Code Online (Sandbox Code Playgroud)
我搜索了各种问题和示例,但没有一个对我有用。
我的目标是尝试返回带有承诺链的动态 URL。
我对 Angular 中的 async、promise 和 observable 关键字感到非常困惑。
我的项目配置:
Ionic:
Ionic CLI : 6.9.1 (/Users/suatkarabacak/npm/lib/node_modules/@ionic/cli)
Ionic Framework : @ionic/angular 5.1.1
@angular-devkit/build-angular : 0.803.26
@angular-devkit/schematics : 8.3.26
@angular/cli : 8.3.26
@ionic/angular-toolkit : 2.2.0
Cordova:
Cordova CLI : 9.0.0 (cordova-lib@9.0.1)
Cordova Platforms : android 8.1.0, ios 5.1.1
Cordova Plugins : cordova-plugin-ionic-keyboard 2.2.0, cordova-plugin-ionic-webview 4.2.1, (and 7 other plugins)
Utility:
cordova-res : 0.14.0
native-run : 1.0.0
System:
ios-deploy : 1.9.4
ios-sim : 8.0.2
NodeJS : v10.16.3 (/usr/local/bin/node)
npm : 6.9.0
OS : macOS Catalina
Xcode : Xcode 11.3 Build version 11C29
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我将使用自定义管道来实现您的要求。
所以基本上你的模板中有类似以下内容的内容:
<ion-col ... *ngFor="let cat of categories ..." ...>
<ion-img ... [src]="cat | catImageUrl | async"></ion-img>
</ion-col>
Run Code Online (Sandbox Code Playgroud)
然后,您将实现一个自定义Angular 管道,从猫对象异步获取猫图像 URL:
@Pipe({name: 'catImageUrl'})
export class CatImageUrlPipe implements PipeTransform {
constructor(/* inject your cache service */) {}
transform(cat: Category): Promise<string> {
return this.cacheService.checkFile(cat.image.url);
}
}
Run Code Online (Sandbox Code Playgroud)
这就是您所需要的。基本上,您将 2 个管道组合在一起进行Category -> Promise<string> -> string转换以获取图像 url。
| 归档时间: |
|
| 查看次数: |
15521 次 |
| 最近记录: |