JavaScript-asyc await

网友投稿 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小时内删除侵权内容。

上一篇:uni-app 语法
下一篇:赵本山女儿辟谣移民传闻,自曝在高中时已挣了百余万!
相关文章

 发表评论

暂时没有评论,来抢沙发吧~