c语言sscanf函数的用法是什么
287
2022-09-24
JavaScript-asyc await
try catch
try catch JavaScript的异常捕获机制,凡是在try语句块中的代码出错了,都会被catch捕获。
then catch
Promise实例有两个方法:
then 指定了resolve状态和reject的回调函数,通过then方法获取异步操作的结果。catch 专门用来捕获Promise对象产生的错误
then和catch方法返回的是一个新的Promise对象,因为Promise对象具有then和catch方法,所以可以一直.then和.catch下去。
.then( value => { console.log(value); }, reason => { console.log(reason); })
then方法的参数是两个回调函数,都接受Promise对象传出的值作为参数:
第一个参数是resolve状态的回调函数第二个参数是reject的回调函数, 这个参数是可选的
通常这个参数也不写,因为Promise实例还有一个方法叫catch是专门用来捕获异常的。
catch 是 .then(null, rejection)的别名,用于指定发生错误时的回调函数。
一旦catch前面的任何一个Promise发生异常,都会被catch捕获,包括Promise函数创建的Promise,还有.then返回的Promise,甚至catch前面如果还有一个catch在这个catch抛出的异常也会被后一个catch捕获。
也就是说:
Promise对象的错误具有冒泡性质,会一直向后传递,直到被捕获为止,也即是说,错误总会被下一个catch语句捕获。
所以,既然这个catch这么厉害,then函数中的第二个参数常常被省略了,然后被这个catch方法替代。
所以通常这么写:
promise.then().catch()
promise.then().then().catch()
promise.then().then().catch().then().catch()
// badpromise .then(function(data) { // success }, function(err) { // error });// goodpromise .then(function(data) { //cb // success }) .catch(function(err) { // error });
一般总是建议,Promise 对象后面要跟catch方法,这样可以处理 Promise 内部发生的错误。catch方法返回的还是一个 Promise 对象,因此后面还可以接着调用then方法和catch方法。
直接返回一个状态为rejected Promise对象
Promise.reject(reason)方法也会返回一个新的 Promise 实例,该实例的状态为rejected。
var p = Promise.reject('出错了'); //等价于 new Promise(function (resolve,reject) { reject('出错了'); })
Promise.reject()方法的参数,会原封不动地作为reject的理由,变成后续方法的参数。不会像Promise.resolve那样,根据不同的情况包装Promise。
async函数
async函数是Generator函数的语法糖(将Generator的星号换成async 将yield换成await)
Generator是一个状态机,封装了多个内部状态,执行 Generator 函数会返回一个遍历器对象,返回的遍历器对象,可以使用next依次遍历 Generator 函数内部的每一个状态。Generator 函数是分段执行的,yield表达式是暂停执行的标记,而next方法可以恢复执行。Generator 函数的执行必须靠执行器。
async函数的返回值为Promise对象Promise对象的结果由async函数执行的返回值决定
async function test_02() { return "success";}console.log(test_02());
或者
async function test_02() { return "success";}p = test_02();console.log(p);
test_02函数加了async,返回结果就是一个promise对象。
对象状态为resolved,对象值为返回字符串“success”。
function test_01() { new Promise((resolve, reject) => { resolve('success'); reject('fail...') }).then( value => { console.log(value); }, reason => { console.log(reason); } )}test_01();
test_01函数与test_02函数执行结果一样,但是test_02函数更加简洁。
async function test_02() { throw 2;};const p = test_02();p.then( null, reason => { console.log('onRejected:' + reason); });console.log(p);
async函数的promise对象返回值,可以是成功,也可以是失败。
await
await右侧的表达式可以是promise对象,也可以是其他值(字符串、普通类型数值等)。如果表达式是promise对象,await返回的是promise成功的值。promise失败的值,由try/catch获取。await必须写在async函数中,但aysnc函数中可以没有await。如果await的promise失败,就会抛出异常。异常需通过try/catch捕获处理。
async函数 相当于对多个Promise的封装,所以必须等到内部所有的await命令执行完,才会改变自己的状态为resolved,除非 碰到return语句或者抛出了异常。
只要一个await后面的Promise变为rejected,整个async函数就会中断执行,整个async返回的Promise对象就会是rejected状态。
async function f() {await Promise.reject('出错了');await Promise.resolve('hello world'); // 不会执行}
第一个await后面的对象reject了,所以整个async函数就中断执行了。
有时,我们希望即使前一个异步操作失败,也不要中断后面的异步操作。
这时可以将第一个await放在try...catch结构里面,这样不管这个异步操作是否成功,第二个await都会执行。
通过try catch捕获异常
如果有多个await命令,可以将其都放在try catch结构中,如果执行出错,catch会去捕获异常
async function f() { try { await Promise.reject('出错了'); console.log('上面已经出错了'); // 不打印 return await Promise.resolve('hello world'); // 不执行 } catch(e) { console.log(e); } } f() .then(v => console.log(v))
catch会去捕获try代码块中的错误,只要有一个抛出了异常,就不会继续执行。
因为使用了trycatch 所以 async 是顺利执行完成的,其中的报错被 try catch处理了,所以异常不会被async返回的Promise的catch捕获,因此async返回的Promise对象状态是resolved。
async function f() { try { await Promise.reject('出错了'); console.log('上面已经出错了'); // 不打印 return await Promise.resolve('hello world'); // 不执行 } catch(e) { console.log("1111"); console.log(e); } } f() .then(v => { console.log(v); console.log(3333) }) .catch( console.log("2222") )
line81 执行并打印undefined,是因为最终promise对象转为resolved状态,但是没有value值。
function fn1() { return new Promise((resolve, reject) => { setTimeout(() => { resolve(5); }) })}function fn2() { return 6;}async function test() { const v1 = await fn1(); const v2 = await fn2(); console.log('value1', v1); console.log('value2', v2);}test();运行结果:value1 5value2 6
await右侧表达式为promise,则得到结果为promise成功的value。
await右侧表达不是promise,则得到结果为返回值自身。
await只能等得成功的结果,失败的结果用try/catch
任何表达式之前都可以加await,看结果是不是promise。如果得到结果是promise,则返回promise内部的value。如果是普通值,则结果为该值本身。
参考:
await promise try...catch)
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~