javascript - 创建具有动态超时的承诺
问题描述
我创建了一个Promise
in oder 来获取一个文件的持续时间,只要它完成了它的合成。
我相信该解决方案确实效率低下,因为timeout
无论任务何时完成我都设置了一个,所以每次调用该方法时我可能只会浪费时间:
polly.synthesizeSpeech(params, function (err, data) {
if (err)
console.log(err, err.stack);
else {
var uInt8Array = new Uint8Array(data.AudioStream);
var arrayBuffer = uInt8Array.buffer;
var blob = new Blob([arrayBuffer]);
var urlAudioFile = URL.createObjectURL(blob);
var audio = new Audio(urlAudioFile);
audio.type = 'audio/wav';
getAudioFileDurationAsync(audio);
};
});
function getAudioFileDurationAsync(audio) {
let promise = new Promise(function (resolve, reject) {
setTimeout(() => {
resolve("done!")
}, 3000);
});
promise.then(
result => {
console.log(audio.duration);
},
error => console.log(error) // doesn't run
);
};
显然,在3000ms
我得到文件的持续时间之后,但我想在文件完成合成后立即进行。我怎么能做到?
解决方案
这对你有用吗?
基本上你只需要用 Promise 包装你想要通知的代码。如果您像示例中那样有一个回调函数,那么您所要做的就是让它从该回调中解析。
const audioFileDuration = (params) => new Promise((resolve, reject) => {
polly.synthesizeSpeech(params, function(err, data) {
if (err) {
reject(err);
}
var uInt8Array = new Uint8Array(data.AudioStream);
var arrayBuffer = uInt8Array.buffer;
var blob = new Blob([arrayBuffer]);
var urlAudioFile = URL.createObjectURL(blob);
var audio = new Audio(urlAudioFile);
audio.type = 'audio/wav';
resolve(audio.duration)
});
});
audioFileDuration(params).then(duration => console.log(duration))
推荐阅读
- office365 - 预警系统。更新项目。为什么 ChangeKey 不改变?
- oracle - Oracle XmlType 到存储过程输出参数
- google-chrome - 有没有办法通过网络选项卡中的名称过滤掉 API - Google Chrome 开发者工具
- oracle - 用于更新 Oracle 表字段的 IF 语句脚本
- c++ - C++ 赋值构造函数 Valgrind 错误
- c# - sql记录查找的布尔结果问题
- javascript - 用javascripts中的汉字将十六进制解码为字符串
- java - 如何在 Cloud Firestore 中正确构建本地化内容?
- javascript - 表格中的 Javascript 动画不起作用。怎么修?
- reactjs - React16 两个组件通信