还望大神不吝赐教!
await后面的仍然是异步啊。而且从发展上看,最初是纯异步,除了性能似乎没啥优势,callbackhell被无数人恶意攻击,随着技术发展,它借鉴C#等语言里优秀的流程控制,在保证异步性能的前提下完成同步写法,这是历史的演进
阻塞是不管你进来多少请求,只要有一个卡住了,别的也得等这个处理要才能继续往下。 这2个关键字的异步,是这个请求被卡住等待,别的请求照跑。
首先要了解的是 async/await 解决什么问题。例子胜千言。
async function doThing() {
await doA()
await doB()
}
function doAnotherThing() {
console.log('do another thing')
}
async function doA() {
return new Promise(resove => {
setTimeout(() => {
console.log('done A')
resove()
}, 0)
})
}
async function doB() {
return new Promise(resove => {
setTimeout(() => {
console.log('done B')
resove()
}, 0)
})
}
doThing().then(console.log('done Thing'))
doAnotherThing()
比纯异步弱点,比同步强点
本质上还是异步,代码层面上是同步。查查async await的实现思想就造了,是一步步发展来的~
async/a wai t只是代码以同步风格 书写。await只是等待异步结果,并不会阻塞整个线程
async fn () {} --> 返回的仍然是一个promise,语法的效果只是让代码看起来有wait而已。
@chrischjh 如果长时间等不到结果,await下面的代码会执行么?
**@i5ting
const superagent = require(‘superagent’);
const fs = require(“fs”);
第一种情况:
async function A(){
let result= await read();
if(result){
console.log(“我不会被阻塞!”);
}
}
async function read(){
fs.readFile(__dirname+"/transfer.js", “utf8”, function(error, file) {
if (error) throw error;
return true;
});
}
调用A函数不会有任何输出,此时result为undefined,
第二种情况:
async function A(){
let result = await superagent.get(‘www.baidu.com’);
if(result){
console.log(“我不会被阻塞!”);
}
}
调用A函数输出我不会被阻塞!,同样是await后面两个异步操作,为什么第一种情况会先执行await后面的代码,而第二种情况会等到get请求返回结果后再去执行后面的代码?
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); async function log(i) { await sleep(1000); console.log(i); } (async () => { await (new Array(10).fill(0).map((_, i) => log(i))) })() .catch(e => console.log(e));
此例子会在一秒后 同时输出10个数.
@JustforNode async标记的方法必须返回promise才有意义,不然还是个同步方法
@winglight async function A(){ let result = await superagent.get(‘www.baidu.com’); if(result){ console.log(“我不会被阻塞!”); } } 这个地方为什么会等待get请求返回结果后在继续向下执行,而不是先执行下面的?
@JustforNode fs.readFile是异步方法,它肯定不会有结果的。此处当用promise来封装