首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在node.js中使用函数数组可以很好地工作,但是await不等待?

在node.js中使用函数数组可以很好地工作,但是await不等待的原因是因为async/await机制与函数数组的执行顺序有关。

首先,让我们了解一下async/await机制。async函数是一个返回Promise对象的函数,它内部可以使用await关键字来等待一个Promise对象的完成。await关键字会暂停函数的执行,直到Promise对象完成,然后恢复函数的执行并返回结果。

在使用函数数组时,如果函数数组中的函数没有返回Promise对象,那么await关键字将不会起作用,因为它需要等待Promise对象的完成。这可能是导致await不等待的原因之一。

另外,函数数组中的函数可能会有异步操作,例如调用一个异步API或执行一个定时器。这些异步操作不会阻塞函数数组的执行,因此在遇到await关键字时,函数数组可能已经继续执行下一个函数了,导致await不等待的现象。

要解决这个问题,可以将函数数组中的每个函数都改写为返回Promise对象的形式。这样,await关键字才能正确等待Promise对象的完成。以下是一个示例代码:

代码语言:txt
复制
const func1 = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('Function 1');
    }, 1000);
  });
};

const func2 = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('Function 2');
    }, 2000);
  });
};

const func3 = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('Function 3');
    }, 3000);
  });
};

const executeFunctions = async () => {
  const functions = [func1, func2, func3];
  for (const func of functions) {
    const result = await func();
    console.log(result);
  }
};

executeFunctions();

在这个示例中,我们将每个函数改写为返回Promise对象的形式,使用setTimeout模拟异步操作。在executeFunctions函数中,我们使用for...of循环依次执行函数数组中的每个函数,并使用await关键字等待每个函数的Promise对象完成。

这样,执行结果会按照函数数组的顺序输出,确保了await的等待效果。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Node.js中常见的异步等待设计模式

Node.js的异步/等待打开了一系列强大的设计模式。现在可以使用基本语句和循环来完成过去采用复杂库或复杂承诺链接的任务。...我已经用co编写了这些设计模式,但异步/等待使得这些模式可以vanilla Node.js访问,不需要外部库。...我记得我第一次尝试这种模式与合作,我感到莫名其妙,它实际工作但是,下面的就不能正常工作。请记住,await必须始终async函数,而传递给forEach()下面的闭包不是async。...请注意,下面的代码并没有Node.js的任何目前发布的版本工作,这只是什么是可能在未来的一个例子。...Promise.all(promises)); } 该Promise.all()函数接受一组承诺,并返回一个承诺,等待数组的每个承诺解析,然后解析为一个数组,该数组包含解析的原始数组每个承诺的值。

4.7K20

JavaScript 编程精解 中文第三版 十一、异步编程

但是,我们希望单个程序等待网络请求时能做一些事情,这并没有什么帮助。 异步 同步编程模型,一次只发生一件事。 当你调用执行长时间操作的函数时,它只会在操作完成时返回,并且可以返回结果。...我们可以使用一个小例子来比较同步和异步编程:一个从网络获取两个资源然后合并结果的程序。 同步环境,只有在请求函数完成工作后,它才返回,执行此任务的最简单方法是逐个创建请求。...动作开始,当它结束时,使用结果调用回调函数。 例如, Node.js 和浏览器中都可用的setTimeout函数等待给定的毫秒数(一秒为一千毫秒),然后调用一个函数。...这很好说明了使用原始回调正确处理错误的难度 - 很容易忘记正确处理类似的异常,如果这样做,故障将无法报告给正确的回调。Promise使其大部分是自动的,因此不易出错。...它有一个key方法,但是它返回一个迭代器而不是数组可以使用Array.from函数将迭代器(或可迭代对象)转换为数组。 即使使用Promise,这是一些相当笨拙的代码。

2.6K20
  • ES2017 异步函数的最佳实践(`async` `await`)

    异步函数确实是强大的一个功能。但是为了充分利用异步JavaScript,必须有一些约束。合理使用正常的 promises 和 async 函数,就可以轻松编写功能强大的并发应用程序。...相反,await关键字语义上意味着阻止执行。为了获得最大的效率,判断整个函数体内何时何地使用await关键字是关键点。 等待异步函数的最合适时间并不总是像立即等待"?...`; } 就像这样,我们通过等待异步任务完成的同时执行同步工作,进一步减少了函数的空闲时间。 作为通用的指导原则,必须尽早安排异步I/O操作,但要尽可能晚等待。... Node.js v12 之前,这是许多开发人员使用事件API面临的问题。该API希望?事件处理程序成为异步函数。...此外,使用await关键字可以避免 async 函数快速"弹出"当前调用堆栈。相反,async 函数将保持暂停状态(最后一条语句中),直到await关键字允许该功能恢复。

    1.8K30

    深入探索Node.js:事件循环与回调机制全解析

    事件循环就像是那个忙碌的餐厅经理,他不停查看任务清单,然后指派任务给合适的服务员,确保每个顾客都能及时得到服务。Node.js,事件循环的工作原理也是类似的。...当文件读取完成后,fs.readFile会调用这个回调函数,并传入错误信息或者文件内容。使用回调函数的好处是可以让我们阻塞主线程的情况下处理异步任务。...当一个异步任务完成时,它的回调函数就会被放入事件队列等待事件循环来处理。...函数内部,我们使用await关键字来等待Promise对象的解决。如果Promise对象成功解决,我们就打印文件内容;如果Promise对象失败解决,我们就打印错误信息。...这时,我们可以使用Promise和async/await来改善代码结构。未处理的异常:如果在回调函数抛出异常,而这个异常没有被正确处理,那么程序可能会崩溃。

    14410

    Promise与AsyncAwait:异步编程的艺术

    ', error); } } // 调用异步函数 fetchInfo(); 在上面的代码,async关键字声明了一个异步函数await关键字用于等待Promise的结果。...的高级用法 Async/Await配合for循环与数组迭代 Async/Await可以很好配合for循环以及数组的各种迭代方法(如map, reduce, forEach等)来处理批量异步任务。...Async/Await 则引入了新的语法特性,使得异步代码看起来更像是同步代码,通过async关键字标记函数,并在函数内部使用await关键字等待Promise的结果。...这样可以避免回调函数的嵌套,使得代码更加扁平化和易读。 错误处理: Promise 必须通过.catch()方法来处理错误,如果这样做,未捕获的错误会在Promise链传播。...Async/Await 能够更好模拟同步代码流程,可以单个函数内部顺序执行多个异步操作,逻辑更清晰。

    14610

    Node.js的事件循环

    事件循环不断检查调用堆栈,以查看是否需要运行任何函数。 当执行时,它会将找到的所有函数调用添加到调用堆栈,并按顺序执行每个函数。 你知道调试器或浏览器控制台中可能熟悉的错误堆栈跟踪吗?...让我们看看如何将函数推迟直到堆栈被清空。 setTimeout(() => {}, 0) 的用例是调用一个函数但是代码的每个其他函数已被执行之后。...我们不必等待诸如 setTimeout、fetch、或其他的函数来完成它们自身的工作,因为它们是由浏览器提供的,并且位于它们自身的线程。...ES6 作业队列 ECMAScript 2015 引入了作业队列的概念,Promise 使用了该队列(也 ES6/ES2015 引入)。...有个游乐园过山车的比喻很好:消息队列将你排在队列的后面(在所有其他人的后面),你不得不等待你的回合,而工作队列则是快速通道票,这样你就可以完成上一次乘车后立即乘坐另一趟车。

    2.7K20

    网页抓取教程之Playwright篇

    使用Node.js时,启动函数可以接受LauchOptions类型的可选参数。这个LaunchOption对象又可以发送其他几个参数,例如,headless。...这些方法CSS和XPath选择器中都能正常工作。 03.抓取文本 继续以Books to Scrape页面为例,页面加载后,您可以使用选择器和$$eval函数提取所有书籍容器。...Python有一个函数eval_on_selector,和Node.js的$eval类似,但是不适合这种场景。原因是第二个参数仍需是JavaScript。...某种情况下使用JavaScript可能很好,但在这种情况下,用Python编写整个代码会更加适用。...这些事情也可以通过Puppeteer和Selenium等其他工具来完成,但是如果您需要使用多个浏览器,或者您需要使用JavaScript/Node.js以外的语言,那么Playwright将是一个更好的选择

    11.3K41

    握异步编程新利器——深入理解asyncawait

    JavaScript ,异步编程通常使用回调函数来实现,但是这种方式往往会导致代码可读性差、难以维护。...使用 async/await 时,我们可以使用同步函数一样编写代码,而不必考虑回调函数的嵌套和错误处理。...目前,大多数现代浏览器和 Node.js 版本都支持 async/await但是一些老旧的浏览器和 Node.js 版本可能不支持。二、如何使用 async/await1....;}在上面的代码,foo 函数是一个异步函数,它返回一个字符串。2. 等待 Promise 对象异步函数可以使用 await 关键字等待 Promise 对象的状态变化。...错误处理异步函数,如果 Promise 对象的状态变为 rejected,可以使用try/catch 语句捕获错误。

    68811

    PHP 7终于发布:开发者会选择PHP 7吗?

    程序员们已经能够想象一旦他们的代码出现问题,等待他们修复的工作量该是多么的惊人,尤其是那些自己拥有测试套件的程序员,因为他们可能已经看到有很多的测试显示失败。...一些新特性的计划我们已经“Lately in PHP Podcast”讨论过了。如果你很好奇,你可以追随博客音频或者订阅YouTube频道来获取关于PHP的最新功能的讨论。 1....这使你能够同一个脚本运行多并行任务,而不需要等一个任务执行一个任务。 请不要将异步编程与多线程编程混淆。PHP已经可以使用pthreads extension.执行多线程编程了。...也许你怀疑PHP需要这些构造的必要性,但是一旦你了解他们的优点后,你就会知道他们的重要性。 很多程序员转移到Node.js,因为Node.js支持异步编程。...Node.js目前还不支持async and await关键字,但也只是时间问题,因为async and await也是EcmaScript 7的新特性之一,而且将来的Node.js使用基于EcmaScript

    1.4K50

    JavaScript——ES6模块化与异步编程高级用法

    ES6模块化规范定义: 每个js文件都是一个独立的模块 导入其他模块成员使用import关键字 向外共享模块成员使用export关键字 node.js的ES6模块化 node.js 默认仅支持 CommonJS...模块化规范,若想基于 node.js 体验与学习 ES6 的模块化语法,可以按照 如下两个步骤进行配置: 确保安装了v14.15.1 或更高版本的 node.js package.json 的根节点中添加...按需导入的成员名称必须和按需导出的名称保持一致 按需导入时,可以使用as关键字进行重命名 按需导入可以和默认导入一起使用 直接导入并执行模块的代码 如果只想单纯执行某个模块的代码,并不需要得到模块向外共享的成员...所有文件读取成功(等待机制) console.log(result);//此时数组的Promise实例的顺序就是最终结果的顺序 }) Promise.race()方法 Promise.race...await,则 function 必须被 async 修饰 async 方法,第一个 await 之前的代码会同步执行,await 之后的代码会异步执行 EvenLoop JavaScript

    69340

    如何使用zx编写shell脚本

    顶级await 为了Node.js使用顶级await,也就是await位于async函数的外部,我们需要在ES模块的模式下编写代码,该模式支持顶级await。...然后我们明确从zx包中导入我们想要使用函数和对象。这有助于明确我们脚本中使用的依赖来自哪里。...这对可读性有好处,但由于我们要将输出存储一个变量,我们希望有这个额外的新行。...使用export来导出函数和对象,另一个模块中使用import加载它们。 Node.js生态系统正在逐步采用ES模块,这在客户端JavaScript是很常见的。...首先,让我们添加一个命令来生成一个.gitignore文件,这样我们就不会意外地提交我们希望Git仓库中出现的文件: await $`npx gitignore node`; 上面的命令使用gitignore

    4K20

    Node.js 入门你需要知道的 10 个问题

    Q3: 如何用 Node.js 监听 80 端口? 这是有陷阱的,类似一些 Unix 系统你不应该尝试监听 80 端口,这么做你需要拥有超级用户权限,因此,推荐你这么做。...默认情况下 Node.js 的 APIs 都是异步的,但是你想同步使用也是可以的(同步方式是推荐的)。 例如,这个 fs 模块可以使用同步方式也可以使用异步方式。...关于 Generators 更多信息可以阅读这篇文章 Generators in Node.js 然而,以上的虽然能很好解决回调地狱问题,但是目前有了更好的方案 Async/Await。... Node.js 或者一些其它类型的 JavaScript 项目中,我们都在使用事件驱动编程。也许你并不知道事件驱动编程,但是一些页面加载或按钮单击事件,你已经使用了。...当您调用 getJSONfromDestination 函数并将 jsonfinished 做为参数传递时,它才开始工作。 Q9: 什么是 NPM? Node.js 什么时候需要 NPM?

    1.4K40

    可以浏览器页面运行 node 代码里了!webContainer 发布 1.0

    WebAssembly 和新的 capabilities API 的出现,使得编写一个基于 WebAssembly 的操作系统似乎成为可能,该操作系统功能强大到可以完全浏览器运行 Node.js。...这项技术 StackBlitz 的在线 IDE 可以体验到,其性能可以碾压同类的 web IDE。 如今,这项技术终于对公众开放。...主要特性 • 能够浏览器运行 node.js 及其工具链(如:webpack、vite 等) • 灵活: WebContainers 支持下,编码体验将会大幅提升 • 安全:所有内容都运行在浏览器页面...离线工作。 • 成本效益。计算是本地完成的。购买云服务器。 • 可以扩大用户规模。...以前受限于云服务器的规模,如今直接运行在客户端,使用客户端的算力 • 服务器安全,代码运行在客户侧,担心服务器运行恶意逻辑,例如挖矿 快速开始 启动 webContainer 代码,找个地方调用以下代码即可

    1.1K30

    可以浏览器页面运行 node 代码里了!webContainer 发布 1.0

    WebAssembly 和新的 capabilities API 的出现,使得编写一个基于 WebAssembly 的操作系统似乎成为可能,该操作系统功能强大到可以完全浏览器运行 Node.js。...这项技术 StackBlitz 的在线 IDE 可以体验到,其性能可以碾压同类的 web IDE。如今,这项技术终于对公众开放。...主要特性能够浏览器运行 node.js 及其工具链(如:webpack、vite 等)灵活: WebContainers 支持下,编码体验将会大幅提升安全:所有内容都运行在浏览器页面,非常安全快速...离线工作。成本效益。计算是本地完成的。购买云服务器。可以扩大用户规模。...以前受限于云服务器的规模,如今直接运行在客户端,使用客户端的算力服务器安全,代码运行在客户侧,担心服务器运行恶意逻辑,例如挖矿快速开始启动 webContainer代码,找个地方调用以下代码即可import

    78120

    上天的Node.js之爬虫篇 15行代码爬取京东淘宝资源 【深入浅出】

    ,我们上天的 Node.js可以做!...js文件内运行命令行工具 npm i puppeteer -D 即可 爬虫获取某些有保护机制的网页时可能会失效 初入江湖 -自在境篇 const puppeteer = require('puppeteer...'); // 引入依赖 (async () => { //使用async函数完美异步 const browser = await puppeteer.launch(); //打开新的浏览器...潇洒入世 -逍遥天境篇 上面只爬取了京东首页的图片内容,假设我的需求进一步扩大,需要爬取京东首页 的所有 标签对应的跳转网页的所有 title的文字内容,最后放到一个数组。...page.evaluate 这个函数,内部是处理我们进入想要爬取网页的数据逻辑 page.goto和 page.evaluate两个方法,可以async内部调用多次, 那意味着我们可以先进入京东网页

    2.1K30

    Js的长轮询

    它很容易实现,很多场景下也很好用。 ---- 常规轮询 从服务器获取新信息的最简单的方式是定期轮询。也就是说,定期向服务器发出请求:“你好,我在这儿,你有关于我的任何信息吗?”...它也很容易实现,并且可以无延迟传递消息。 其流程为: 请求发送到服务器。 服务器在有消息之前不会关闭连接。 当消息出现时 —— 服务器将对其请求作出响应。 浏览器立即发出一个新的请求。...subscribe(); } } subscribe(); 正如你所看到的,subscribe 函数发起了一个 fetch,然后等待响应,处理它,并再次调用自身。...使用像 PHP 和 Ruby 语言编写的后端程序会经常遇到这个问题。 使用 Node.js 编写的服务端程序通常不会出现此类问题。 也就是说,这不是编程语言的问题。...只是请确保你的服务器架构同时有很多连接的情况下能够正常工作。 ---- 使用场景 消息很少的情况下,长轮询很有效。

    1.7K20

    Node.js 的这几个场景都可以使用异步迭代器

    上一节讲解了迭代器的使用,如果对迭代器还不够了解的可以回顾下《从理解到实现轻松掌握 ES6 的迭代器》,目前 JavaScript 还没有被默认设定 [Symbol.asyncIterator...] 属性的内建对象,但是 Node.js 已有部分核心模块(Stream、Events)和一些第三方 NPM 模块(mongodb)已支持 Symbol.asyncIterator 属性。...本文也是探索异步迭代器 Node.js 的都有哪些使用场景,欢迎留言探讨。...,基于本章对异步迭代器 events.on() 中使用的学习,可以很好的解释。...可以使用 AbortController 控制器对象中止计时器函数。 setInterval API 介绍 delay:两次迭代之间需要等待的毫秒时间,默认 1。 value:迭代器返回值。

    3.7K40
    领券