FFmpeg5.0核心技术精讲,打造自己的音视频播放器-玉山色变龙蛇寒

2022-12-30 0 735

FFmpeg5.0核心技术精讲,打造自己的音视频播放器-玉山色变龙蛇寒

从await-to-js到try-run-js

FFmpeg5.0关键技术圣埃蒂安德,打造出他们的音频MP3

download:https://97yrbl.com/t-1595.html

以后做标识符评审委员的时份,辨认出有同僚用try catch包装袋了一大堆触发器标识符,真的很幽灵。我不如果只抓取可能将手忙脚乱的标识符吗?同僚通告我,倘若try catchCadours,会呈现出与外回到值不意见分歧的情况,市场需求提前新闻稿表达式。

设RES:Data[]=[];

试著{

RES = await fetch data();

} catch (err) {

//Bijnor或中止

//回到

}

//拒绝执行恒定方法论

的确,再者开发人员千万别大覆盖范围包装袋非极度标识符,另再者提早新闻稿表达式会让标识符不意见分歧,吓倒心绪。一类配套措施是间接利用native Promie,而并非async。

fetchData()。然后((res) => {

}).catch((err) => {

});

所以,当然,关于一个单独的触发器恳求来说没有问题,倘若它是一个依赖的触发器恳求的话。固然在Promise中能够回到另一个Promise恳求,但是这样只能有一个catch。

fetchData()。然后((res) => {

//业务处置

回到fetch data 2(RES);

}).然后((res) => {

//业务处置

}).catch((err) => {

//只能停止一次常规错误处置。

});

倘若市场需求多重抓取处置,我们市场需求这样写。

fetchData()。然后((res) => {

//业务处置

回到fetch data 2(RES);

}).catch((err) => {

//错误处置并回到null

回到null

}).然后((res) => {

if (res === null) {

回到;

}

//业务处置

}).catch((err) => {

//错误处置

});

此时,开发人员还要思索fetchData2能否会回到null。于是个人开端想方法帮我们处理这个问题。

FFmpeg5.0核心技术精讲,打造自己的音视频播放器-玉山色变龙蛇寒

等候到js

Await-to-js是一个协助开发人员处置触发器错误的库。我们先来看看图书馆是如何处理我们的问题的。

从“await-to-js”导入到;

const [fetch1Err,fetch 1 result]= await to(fetch data());

if (fetch1Err) {

//Bijnor或中止

//回到

}

const [fetch2Err,fetch 1 result]= await to(fetch data 2(fetch 1 result));

if (fetch2Err) {

//Bijnor或中止

//回到

}

源标识符十分简单。

将函数导出到(

承诺,

错误下一步,

) {

报答承诺

。然后((数据)= >[空,数据])

。catch((err) => {

if (errorExt) {

const parse derror = object . assign({ },err,errorExt);

return [parsedError,undefined];

}

return [err,undefined];

});

}

利用try-run-js

看到await-to-js把错误当做恒定流程的一局部,个人真的是并非有些触发器标识符问题能够用try catch处理?

函数resolveRef(refName,callback,time: number = 1) {

//跳出递归10次以上

if (time > 10)抛出新错误(`找不到ref:$ { refName } `);

//

const self = this

const ref = this。$ refs[ref name];

if (ref) {

回调(ref);

}否则{

//下次不带节点

这个。$nextTick(() => {

resolveRef.call(self,refName,callback,time+1);

});

}

}

当然,上面的标识符的确能够处理这类问题,我们在处置这类问题时能够交换ref和nextTick的标识符。所以在await-to-js的方法论下,我亲身开发了try-run-js库。我们先来看看库是怎样用的。

从“try-run-js”导入tryRun

tryRun(() => {

//试著间接利用恒定的方法论标识符

//永远不加?。

//标识符不会手忙脚乱,也不会重试

这个。$ refs . nav tree . setcurrentkey(” XXX “);

}, {

//重试次数

retryTime: 10,

//下一次操作以后所需的延迟时间

超时:()=> {

新承诺((处理)=> {

这个。$nextTick(解析);

});

},

});

我们也可能将得到错误的数据和结果。

FFmpeg5.0核心技术精讲,打造自己的音视频播放器-玉山色变龙蛇寒

从“try-run-js”导入tryRun

const getDomStyle = async () => {

//取得单步执行

const { error: domErr,result:DOM style } = await try run(()= > {

//不论ppt能否存在,回到dom节点款式

//永远不加?。

//标识符将无错误地回到undefined。

return document . getelementbyid(” domId “)。作风;

}, {

//重试次数

retryTime: 3,

//倘若回到一个数字,该函数将利用setTimeout。

//参数为当前重试次数,第一次重试100 ms,第二次重试200次。

超时:(时间)= >时间* 100,

//也能够间接回号。不经过的话默许值是333。

//超时:333

});

if (domErr) {

return { };

}

回到domStyle

};

当然,该库还支持回到元组的功用和await-to-js的承诺错误处置。

从“try-run-js”导入{ tryRunForTuple };

const [error,result]= await tryRunForTuple(fetch data());

试运转-js项目停顿

try-run-js的中心在于try catch的处置。下面是try-run-js的写作心绪。希望能对大家有些协助。

支持等候到js

const is Object =(val:any):val is Object = >

瓦尔。== null &&

(type of val = = = ” object ” | | type of val = = = ” function “);

const isPromise = (val: any): val是Promise => {

//继承的承诺

//有then和catch功用,对应手写承诺

回到承诺的val实例||(

isObject(val) &&

typeof val.then === “function” &&

typeof val.catch === “函数”

);

};

const tryRun = async(

//功用或承诺

promiseOrFun: Promise |函数,

//配置项目

选项?:TryRunOptions,

):Promise => {

//当前参数能否为Promise

const runParamIsPromise = isPromise(promise orfun);

const runParamIsFun = type of promise orfun = = = ” function “;

//函数和承诺都不会间接回到错误

倘若(!runParamIsFun &&!runParamIsPromise) {

const paramsError = new Error(“第一个参数必需是函数或承诺”);

将{ error: paramsError }作为TryRunResultRecord回到;

}

if (runParamIsPromise) {

//间接运用await-to-js标识符

回到run Promise(Promise or fun as Promise);

}

};

重试执行时手忙脚乱

接下来,我们开端用try catch抓取函数的错误并重试。

//默许超时

const DEFAULT _ time out:number = 333

//触发器等候

const sleep = (timeOut: number) => {

回到新承诺(resolve => {

setTimeout(() => {

处理()

},超时)

})

}

const tryRun = async(

promiseOrFun: Promise |函数,

选项?:TryRunOptions,

):Promise => {

const { retryTime = 0,timeout = DEFAULT_TIMEOUT } = {

…默许选项,

…选项,

};

//当前重试几次?

let current time:number = 0;

//胜利了吗?

let is success:boolean = false;

让结果;

let error:错误;

while(当前时间

试著{

result = await promise orfun();

//执行终了,得到结果后,以为当前胜利。

isSuccess = true

} catch (err) {

error = err为错误;

//试著次数加1

current time++;

//这里留意,作者在这里犯了一些错误。

//倘若处置不好,会执行不市场需求处置的await。

// 1.倘若目前不市场需求再次恳求(重试次数为0),跳过即可。

// 2.上次失败时(重试后),如果跳过它。

if (retryTime > 0 &&当前时间

let final time out:number | Promise = type of time out = = = ” number “

?超时

:DEFAULT _ TIMEOUT

//倘若是函数执行函数

if(type of time out = = = ” function “){

final time out = time out(current time);

}

//当前回到承诺,间接等候

if (isPromise(finalTimeout)) {

等候finalTimeout

}否则{

//倘若最终结果并非数字,则将其更改为默许数据

if (typeof finalTimeout!== “数字”){

finalTimeout = DEFAULT _ TIMEOUT

}

//这里我试着用NaN,-Infinity,Infinity

//辨认出setTimeout已被处置。下面是阅读器的处置方式。

//倘若timeout是一个无量大值、非数字(NaN)值或负值,则让timeout为零。

//负数,无量大和NaN都会变成0

等候睡眠(final time out);

}

}

}

}

//回到胜利或失败

倘若(发布胜利){

回到{结果,错误:null };

}

回到{ error: error!,结果:未定义};

};

就这样,我们根本完成了试跑-js。

添加tryRunForTuple函数

这十分简单,间接试著运转并转换结果:

const tryRunForTuple =(

promiseOrFun: Promise |函数,

选项?:TryRunOptions): Promise => {

回到tryRun(promiseOrFun,options)。然后(res => {

const { result,error } = res

倘若(错误){

将[错误,未定义]作为[任何,未定义]返回

}

以[null,t]的方式回到[null,result]

})

}

标识符都在try-run-js里。人们在什么情况下会利用try-run-js?也欢送您提交问题和公关。

举报/反馈

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务