angular - 将谷歌字体渲染为 svg 路径路径,但包装为承诺
问题描述
我有以下脚本,它执行异步操作。我想把它包装在一个承诺中,但我不确定如何。
static renderGoogleFontToSvgPath(): Promise<string> {
const url = 'http://fonts.gstatic.com/s/quicksand/v21/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkKEo18G0wx40QDw.ttf';
const text = 'hello';
const size = 14;
const union = false;
const bezierAccuracy = 0;
let svg = null;
opentype.load(url, (err, font) => {
const textModel = new makerjs.models.Text(font, text, size, union, false, bezierAccuracy);
svg = makerjs.exporter.toSVG(textModel);
// produces code here
console.log(svg)
});
// null
return svg;
}
当我在这里调用它时,结果为空。
ngOnInit(): void {
const font = BuilderSidebarTextService.renderGoogleFontToSvgPath();
console.log(font);
}
如何以兼容 Angular 的方式修复它。
解决方案
到函数返回时,svg
变量的值为 null,因为它是在异步函数中设置的。所以你需要返回一个Promise
.
static renderGoogleFontToSvgPath(): Promise<string> {
const url = 'http://fonts.gstatic.com/s/quicksand/v21/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkKEo18G0wx40QDw.ttf';
const text = 'hello';
const size = 14;
const union = false;
const bezierAccuracy = 0;
let svg = null;
return new Promise(resolve => {
opentype.load(url, (err, font) => {
const textModel = new makerjs.models.Text(font, text, size, union, false, bezierAccuracy);
svg = makerjs.exporter.toSVG(textModel);
// produces code here
resolve(svg);
});
});
}
并像下面这样使用它:
async ngOnInit(): void {
const font = await BuilderSidebarTextService.renderGoogleFontToSvgPath();
console.log(font);
}
推荐阅读
- python - 大型 JSON 文件:在 dict 值中搜索字符串
- javascript - 更新 ngx-translate 加载器中的翻译
- docker - VM 中 Kubernetes 集群和 Docker 容器之间的路由
- javascript - 从javascript中的文档或快照获取firestore服务器时间
- c# - C# - Webbrowser 无法像 IE 那样处理 url
- sql - oracle sql列表
- bazel - Bazel 对 attr.label_keyed_string_dict 的键进行隐式排序
- python - 从具有非常嵌套的模块结构的模块导入的 PEP 样式指南
- javascript - Facebook 使用 Open Graph 分享
- symfony - 如何在 Symfony 中覆盖构造函数