新人对“promise让写写异步代码就跟写同步代码一样”的疑问
发布于 7 年前 作者 cheeseKun 4202 次浏览 来自 问答
const readFile = function (fileName) {
  return new Promise(function (resolve, reject) {
    fs.readFile(fileName, 'utf8', function (error, data) {
      if (error) return reject('出错啦' + error);
      resolve(data);
    });
  });
};
(async function() {
	let data = await readFile(./data.json)
	console.log(data)
})()

await既然会等待获取完数据后,再进行console 那就不跟同步一样了么, 如果万一文件读取时间很长, 那不是会堵塞进程么,那所谓的node的异步,非堵塞体现在哪 这跟直接用readFileSync()读取数据有什么区别

promise让写写异步代码就跟写同步代码一样 这句话理解不能 困扰了很久,我觉得是我误解了,但是看很多资料感觉也没能理解 第一次在社区提问,求解答

8 回复
async function task (name, message, delay = 1) {
  await new Promise(resolve => setTimeout(resolve, 1000 * delay))
  return console.log(`${name}: ${message}`)
}

;(async function () {
  task('A', '我太慢了,大家不用等我。', 3)
  task('B', '我有急事,先走一步。', 0)
  await task('C', '后面的等我一下……')
  task('D', 'C 挡住我了。')
})()

我想上面的代码把你的问题解释清楚了……阻塞不阻塞要看你怎么写,并不强制一定要 await。await 阻塞的是 async 函数,不是整个 Node。

先去去读读《深入浅出node.js》,了解一下node非阻塞异步是怎么一回事

@cheeseKun 看看我的文章,好好理解 js 中的异步: http://www.cnblogs.com/htoooth/p/5406831.html

不存在数据依赖关系就别await嘛,看nodejs多了都不会正常编程了吗…

了解异步需要先了解什么是阻塞 异步和多线程都是解决阻塞时占用资源的问题(通常是cpu资源)

之所以大家会说Promise是用同步的方式处理异步是因为js里面大部分异步的逻辑是写在函数对象里的…异步还存在一个流程控制的问题…异步的流程控制不在js线程之上…Promise的resolve和reject会把异步函数的执行结果取出来而已…用Promise可以让代码读起来像是同步

@htoooth 特别棒的文章。 我自己再看一下深入浅出的异步那章。 谢谢你

来自酷炫的 CNodeMD

async/await 只是异步封装语法糖,并不是真正的变成了同步,该异步还是异步,只是通过语法糖封装了执行顺序

回到顶部