用nodejs开发的时候,总会碰到一些莫明其妙的问题,排查到最后,才发现是异步搞的鬼
比如:
- nodejs里的for循环是异步的吗?
- 可以总结为带有回调的都是异步的吗?好像不能这样记,nodejs api里有个读取文件的方法就分为 readFile readFileSync,可气的是它们都是有回调的
有大佬能不吝赐教讲解一下吗?跪谢!
另外还有一个问题,循环一个集合有很多方法,for, each, forEach, map等,这些东西里哪些是nodejs内置的?哪些是jquery里的?哪些是es规范里的呢?它们都是同步的还是异步的呢?
还请原谅我这小白的问题,相信很多学习nodejs的朋友都有过这样的疑惑 :joy
补充:
虽然现在 ES 标准里加上了 async await 来实现同步操作,还有 Promise,但业务复杂了,代码还是会被各种回调弄的执行流程出问题
举个例子
写 js 的时候用的最多的应该就是回调了,回调里可以传很多个参数,简单的操作,这样写很方便,但业务复杂了,就不方便了,回调地狱也就是这样来的
这时候你可能会说不是有 Promise 吗,但用这货我觉得也就是把代码变的好看些,拿结果还是要靠 then 方法回调拿
到这你可能还会说,不是还有 async await 吗,这货确实不用从 then 函数的回调里拿数据了,但用 nodejs 多了就会发现,很多函数的调用的写法还是会用到回调,而且这时候还会在回调函数的前面加上个 async,我也是无语了,这不是又回到起点了吗,如下
it ('waitBody', async function() {
await driver.sleep(500).wait('body', 30000).html().then(function(code) {
isPageError(code).should.be.false;
})
})
当然也有用起来舒服的地方,比如 mongoose 的查询
const results = await UserModel.find({});
综上,难道就没有一个优雅的方法能让代码一行一行的执行吗,前一个结果执行完了,拿到结果再参与下一行代码的执行?
有人会说了,你上面不是说了 async await 了吗,它不就是这样用的吗?那为啥还要在回调的方法上用 async await 呢?总觉得有点换汤不换药,折腾来折腾去,还是离不了回调,但回调又会涉及到代码结构和流程控制上的问题