【发布时间】:2020-02-16 21:37:09
【问题描述】:
我正在尝试使用离子媒体插件播放多个音频文件:https://ionicframework.com/docs/native/media。但我很难在不使用超时功能的情况下将其用作播放列表。
这是我尝试过的
playOne(track: AudioFile): Promise<any> {
return new Promise(async resolve =>{
const AudFile = await this.media.create(this.file.externalDataDirectory+track.trackUrl);
await resolve(AudFile.play())
});
}
然后玩 All ,我有这个:
async playAll(tracks: AudioFile[]): Promise<any>{
let player = (acc, track:AudioFile) => acc.then(() =>
this.playOne(track)
);
tracks.reduce(player, Promise.resolve());
}
这样他们就可以同时玩了。
但是如果PlayOne方法被包裹在一个timeout函数中,则在播放列表中存在timeout设置的毫秒间隔,但不一定在另一个开始之前完成,有时会等待很长时间才开始后面的文件是格子的。
超时实现如下所示:
playOne(track: AudioFile): Promise<any> {
return new Promise(async resolve =>{
setTimeout(async ()=>{
const AudFile = await this.media.create(this.file.externalDataDirectory+track.trackUrl);
await resolve(AudFile.play())
},3000)
});
}
深入研究插件的 ionic 包装器,create 方法如下所示:
/**
* Open a media file
* @param src {string} A URI containing the audio content.
* @return {MediaObject}
*/
Media.prototype.create = function (src) {
var instance;
if (checkAvailability(Media.getPluginRef(), null, Media.getPluginName()) ===
true) {
// Creates a new media object
instance = new (Media.getPlugin())(src);
}
return new MediaObject(instance);
};
Media.pluginName = "Media";
Media.repo = "https://github.com/apache/cordova-plugin-media";
Media.plugin = "cordova-plugin-media";
Media.pluginRef = "Media";
Media.platforms = ["Android", "Browser", "iOS", "Windows"];
Media = __decorate([
Injectable()
], Media);
return Media;
}(IonicNativePlugin));
任何建议将不胜感激
【问题讨论】:
-
在链接到插件之后,我没有看到任何迹象表明
create返回了一个承诺,因此await它没有任何意义。另外,永远不要将async函数传递给new Promise,这是没有意义的。您能否指出该create函数的一些文档?您链接到链接here 的页面,但没有显示create函数(您的代码和您链接的页面使用),它使用Media作为构造函数(new Media),所以... -
@T.J.Crowder 感谢您的 cmets。我已经编辑了我的问题以包含离子创建包装器
-
插件的 API 文档在哪里?据我所知,您链接到的页面有使用示例,而不是 API 信息。
-
除了github链接,我知道的另一个链接是cordova.apache.org/docs/en/latest/reference/…
标签: javascript angular ionic-framework ionic4 cordova-media-plugin