CNode

请问async await需要等到返回结果后才能向下执行,这是不是违背了node异步非阻塞io的模式呢?

问答
JJustforNode发布于10 年前最后回复10 年前13 回复18868 浏览0 收藏

还望大神不吝赐教!

查看回复

回复 (13)

I
i5ting#1·10 年前

await后面的仍然是异步啊。而且从发展上看,最初是纯异步,除了性能似乎没啥优势,callbackhell被无数人恶意攻击,随着技术发展,它借鉴C#等语言里优秀的流程控制,在保证异步性能的前提下完成同步写法,这是历史的演进

K
klausgao#2·10 年前

阻塞是不管你进来多少请求,只要有一个卡住了,别的也得等这个处理要才能继续往下。 这2个关键字的异步,是这个请求被卡住等待,别的请求照跑。

M
metrue#3·10 年前

首先要了解的是 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()
C
captainblue2013#4·10 年前

比纯异步弱点,比同步强点

D
DevinXian#5·10 年前

本质上还是异步,代码层面上是同步。查查async await的实现思想就造了,是一步步发展来的~

C
chrischjh#6·10 年前

async/a wai t只是代码以同步风格 书写。await只是等待异步结果,并不会阻塞整个线程

F
flamingtop#7·10 年前

async fn () {} --> 返回的仍然是一个promise,语法的效果只是让代码看起来有wait而已。

J
JustforNode#8·10 年前
引用 chrischjhasync/a wai t只是代码以同步风格 书写。await只是等待异步结果,并不会阻塞整个线程

@chrischjh 如果长时间等不到结果,await下面的代码会执行么?

J
JustforNode#9·10 年前
引用 i5tingawait后面的仍然是异步啊。而且从发展上看,最初是纯异步,除了性能似乎没啥优势,callbackhell被无数人恶意攻击,随着技术发展,它借鉴C 等语言里优秀的流程控制,在保证异步性能的前提...

**@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请求返回结果后再去执行后面的代码?


J
joesonw#10·10 年前

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个数.

W
winglight#11·10 年前
引用 JustforNode@i5ting const superagent = require('superagent'); const fs = require("fs"); 第一种情况: async functio...

@JustforNode async标记的方法必须返回promise才有意义,不然还是个同步方法

J
JustforNode#12·10 年前
引用 winglight@JustforNode async标记的方法必须返回promise才有意义,不然还是个同步方法

@winglight async function A(){ let result = await superagent.get(‘www.baidu.com’); if(result){ console.log(“我不会被阻塞!”); } } 这个地方为什么会等待get请求返回结果后在继续向下执行,而不是先执行下面的?

I
i5ting#13·10 年前
引用 JustforNode@i5ting const superagent = require('superagent'); const fs = require("fs"); 第一种情况: async functio...

@JustforNode fs.readFile是异步方法,它肯定不会有结果的。此处当用promise来封装

参与回复
登录后即可参与回复。登录