请问async await需要等到返回结果后才能向下执行,这是不是违背了node异步非阻塞io的模式呢?
发布于 8 年前 作者 JustforNode 17767 次浏览 来自 问答

还望大神不吝赐教!

13 回复

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来封装

回到顶部