
从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。于是个人开端想方法帮我们处理这个问题。

等候到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(解析);
});
},
});
我们也可能将得到错误的数据和结果。

从“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?也欢送您提交问题和公关。
