JavaScript异步操作
promise
js单线程
https://blog.csdn.net/qq_40099141/article/details/83991213
回调
1 | function callback() { |
最简单的promise
1 | 定义函数 |
调用函数
1 | test(function(mes){console.log(mes);},function(mes){console.log(mes);}) |
这个test()函数有两个参数,这两个参数都是函数,如果执行成功,我们将调用resolve(‘200 OK’),如果执行失败,我们将调用reject(‘timeout in ‘ + timeOut + ‘ seconds.’)。可以看出,test()函数只关心自身的逻辑,并不关心具体的resolve和reject将如何处理结果。
1 | var p1 = new Promise(test); |
new Promise(test).then(job2).then(job3).catch(handleError);
catch捕获的是job2,job3中所有的错误
async
我们说JavaScript异步操作需要通过Promise实现,一个Promise对象在操作网络时是异步的,等到返回后再调用回调函数,执行正确就调用then(),执行错误就调用catch(),虽然异步实现了,但是一堆then()、catch()写起来麻烦看起来也乱。
有没有更简单的写法?
在普通function中调用async function,不能使用await(会报错),但可以直接调用async function拿到Promise对象,后面加上then()和catch()就可以拿到结果或错误了。
await调用必须在async function中,不能在传统的同步代码中调用。
可以用关键字async配合await调用Promise,实现异步操作,但代码却和同步写法类似:
fetch 的返回值是Promise
1 | async function get(url) { |
使用async function可以定义一个异步函数,异步函数和Promise可以看作是等价的,在async function内部,用await调用另一个异步函数,写起来和同步代码没啥区别,但执行起来是异步的。
也就是说:
1 | let resp = await fetch(url); |
自动实现了异步调用,它和下面的Promise代码等价:
1 | let promise = fetch(url); |
如果我们要实现catch()怎么办?用Promise的写法如下:
1 | let promise = fetch(url); |
用await调用时,直接用传统的try{ ... } catch:
1 | async function get(url) { |
用async定义异步函数,用await调用异步函数,写起来和同步代码差不多,但可读性大大提高。
需要特别注意的是,await调用必须在async function中,不能在传统的同步代码中调用。那么问题来了,一个同步function怎么调用async function呢?
首先,普通function直接用await调用异步函数将报错:
1 | ; |
SyntaxError: await is only valid in async functions and the top level bodies of modules
如果把await去掉,调用实际上发生了,但我们拿不到结果,因为我们拿到的并不是异步结果,而是一个Promise对象:
1 | ; |
[object Promise]2
因此,在普通function中调用async function,不能使用await,但可以直接调用async function拿到Promise对象,后面加上then()和catch()就可以拿到结果或错误了:
1 | ; |
因此,定义异步任务时,使用async function比Promise简单,调用异步任务时,使用await比Promise简单,捕获错误时,按传统的try...catch写法,也比Promise简单。只要浏览器支持,完全可以用async简洁地实现异步操作。
let ss = await asyncGetStorage(‘ddd’); asyncGetStorage返回了一个Promise对象,为什么ss不是一个Promise对象?
1 | 在JavaScript中,await 关键字用于等待Promise对象解析,并获取其结果。当它前缀在一个Promise表达式上时,会暂停后面代码的执行,直到Promise完成(resolve)并返回Promise的结果。 |
网络请求
fetch(“https://jsonplaceholder.typicode.com/users“)
.then((res) => res.json())
.then((data) => console.log(data));
参考链接:
Fetch、Axios、Ajax 的理解
https://blog.csdn.net/qq_64655972/article/details/134112133
下一代ajax技术 fetch api
https://blog.csdn.net/ZHANGYANG_1109/article/details/127996511