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

即使使用了promises,查询也不会按顺序运行

的原因是因为promise是一种异步编程的解决方案,它允许我们在进行耗时操作时不会阻塞主线程,而是通过回调函数的方式在操作完成后进行处理。

在JavaScript中,当我们使用promise进行异步操作时,可以通过.then()方法来注册回调函数,这些回调函数会在promise状态变为resolved时被调用。但是,由于promise是并发执行的,所以无法保证它们的执行顺序。

例如,假设我们有两个查询操作A和B,它们都返回一个promise对象。如果我们按照以下方式编写代码:

代码语言:txt
复制
queryA().then(() => {
  console.log("Query A completed");
});

queryB().then(() => {
  console.log("Query B completed");
});

虽然我们先调用了queryA(),但是无法保证它会先于queryB()执行完毕。这是因为queryA()和queryB()是并发执行的,它们的执行顺序取决于它们的耗时和其他因素。

如果我们希望按顺序运行查询,可以使用promise的链式调用。通过在.then()方法中返回一个新的promise对象,我们可以确保查询按顺序执行。例如:

代码语言:txt
复制
queryA().then(() => {
  console.log("Query A completed");
  return queryB();
}).then(() => {
  console.log("Query B completed");
});

在这个例子中,当queryA()完成后,我们返回了queryB()的promise对象,并在下一个.then()中处理它。这样,我们就可以确保查询按顺序执行。

总结起来,即使使用了promises,查询也不会按顺序运行是因为promise是并发执行的,无法保证它们的执行顺序。但是,我们可以通过promise的链式调用来确保查询按顺序执行。

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

相关·内容

今日一题 - 请模拟实现一个Promise.all() 方法?

Promise.all()方法的参数可以不是数组,但必须具有 Iterator 接口(所以数组、Map、Set都可以),并且只返回一个Promise实例,输入的所有promise的resolve回调的结果会传入的顺序作为一个数组的其中一项返回...当然支持非promise对象的传入,会作为数组中的一项返回。...多个promise最后返回一个promise 必须全部成功才会返回 失败会优先返回,不会等他promise结果 function customerPromiseAll(promises) {...; //传入的promise个数 let results = new Array(promiseLen);//初始化数组用于存放返回结果 //顺序执行 for...//传入的promise个数 let results = new Array(promiseLen); //初始化数组用于存放返回结果 //顺序执行

1.2K20

JavaScript:ECMAScript 2020中的新增功能

但是,让我们顺序进行详细介绍。 动态导入 当前的模块导入机制基于静态声明,如下所示: import * as MyModule from "..../my-module.js"在上面的示例中)是一个字符串常量,您不能在运行时更改它 这些约束阻止有条件或按需加载模块。同样,在加载时评估每个相关模块会影响应用程序的性能。...在编写旨在在不同环境中运行的代码时,这会导致问题。您可能使用了this关键字,但是它undefined在以严格模式运行的模块和函数中。...空合并运算符 您看过多少次并使用了以下表达式?...最后,Babel和TypeScript等最受欢迎的编译器的最新版本使您可以使用最新的ES2020功能。

1.9K31

Promise机制

Promises 不是一种解决具体问题的算法,而已一种更好的代码组织模式。接受新的组织模式同时,逐渐以全新的视角来理解异步调用。...当 promise 成功执行时,所有 onFulfilled 需按照其注册顺序依次回调;当 promise 被拒绝执行时,所有的 onRejected 需按照其注册顺序依次回调。...这种 thenable 的特性使得 Promise 的实现更具有通用性:只要其暴露出一个遵循 Promise/A+ 协议的 then 方法即可;这同时使遵循 Promise/A+ 规范的实现可以与那些不太规范但可用的实现能良好共存...jQuery 1.8 修正了这个问题,使 then 成为 pipe 的同义词。不过,由于向后兼容的问题, jQuery 的 Promise 再如何对 Promises/A 示好不太会招人待见。...在 JQuery 的 Promise 对象的回调中抛出错误是个糟糕的主意,因为错误不会被捕获。

1.4K100

Promises机制

Promises 不是一种解决具体问题的算法,而已一种更好的代码组织模式。接受新的组织模式同时,逐渐以全新的视角来理解异步调用。...当 promise 成功执行时,所有 onFulfilled 需按照其注册顺序依次回调;当 promise 被拒绝执行时,所有的 onRejected 需按照其注册顺序依次回调。...这种 thenable 的特性使得 Promise 的实现更具有通用性:只要其暴露出一个遵循 Promise/A+ 协议的 then 方法即可;这同时使遵循 Promise/A+ 规范的实现可以与那些不太规范但可用的实现能良好共存...jQuery 1.8 修正了这个问题,使 then 成为 pipe 的同义词。不过,由于向后兼容的问题, jQuery 的 Promise 再如何对 Promises/A 示好不太会招人待见。...在 JQuery 的 Promise 对象的回调中抛出错误是个糟糕的主意,因为错误不会被捕获。

71640

Promise机制详解

Promises 不是一种解决具体问题的算法,而已一种更好的代码组织模式。接受新的组织模式同时,逐渐以全新的视角来理解异步调用。...当 promise 成功执行时,所有 onFulfilled 需按照其注册顺序依次回调;当 promise 被拒绝执行时,所有的 onRejected 需按照其注册顺序依次回调。...这种 thenable 的特性使得 Promise 的实现更具有通用性:只要其暴露出一个遵循 Promise/A+ 协议的 then 方法即可;这同时使遵循 Promise/A+ 规范的实现可以与那些不太规范但可用的实现能良好共存...] 如果 rejectPromise 以据因 r 为参数被调用,则以据因 r 拒绝 promise 如果 resolvePromise 和 rejectPromise 均被调用,或者被同一参数调用了多次...jQuery 1.8 修正了这个问题,使 then 成为 pipe 的同义词。不过,由于向后兼容的问题, jQuery 的 Promise 再如何对 Promises/A 示好不太会招人待见。

1.5K70

新手们容易在Promise上挖的坑~

是的,实际上你可以像使用回调一样使用 promises,恩,就像用打磨机去削脚趾甲一样,你确实可以这么做。 其实有些老司机会犯这样的错误。 正确的代码风格应该是下面这样的: ?...一旦当他们要使用他们熟悉的 forEach() 循环 (无论是 for 循环还是 while 循环),他们完全不知道如何将 promises 与其一起使。因此他们就会写下类似这样的代码。 ?...此外一个更加有用的特效是,一旦数组中的 promise 任意一个返回错误,Promise.all() 会返回错误。 #3 忘记使用.catch() 这是另一个常见的错误。...即使你坚信不会出现异常,添加一个 catch() 总归是更加谨慎的。如果你的假设最终被发现是错误的,它会让你的生活更加美好。...因此如果你在你的代码中使用了这个词 (我不会把这个词重复第三遍!),你就做错了。下面是说明一下如何避免它。

1.5K50

JavaScript 权威指南第七版(GPT 重译)(五)

可以使用生成器掩盖程序中的异步部分,使你的代码看起来是顺序和同步的,尽管你的一些函数调用实际上是异步的并依赖于网络事件。 尝试用生成器做这些事情会导致代码难以理解或解释。...13.2.5 并行的 Promises 我们花了很多时间讨论 Promise 链,用于顺序运行更大异步操作的异步步骤。但有时,我们希望并行执行多个异步操作。...Promise 链使得表达一系列固定数量的 Promises 变得容易。然而,顺序运行任意数量的 Promises 就比较棘手了。...这意味着任何异步迭代器方法必须能够维护一个内部 Promise 队列,以便顺序解析异步事件。...例如,如果属性是可配置的,那么即使该属性是不可写的,可以更改该属性的值。此外,即使属性是不可配置的,可以将属性从可写更改为不可写。以下是完整的规则。

16910

如何序列化Js中的并发操作:回调,承诺和异步等待

假设每个部署都有3个步骤 安装操作系统 部署我们的软件 运行测试 对于任何给定的目标,这3个操作需要按顺序运行,但它们可以跨目标同时执行 (如有任何疑问,欢迎您进行提问和探讨) 并发执行 首先让我们看看一些并发...Returning from async "Run Tests:运行测试" Completed async "Run Tests:运行测试" 好,我们可以看到每一步都顺序进行 但是,这个代码仍然有很多问题...即使有这样一个简单的例子,我认为代码有点难以阅读 错误处理也许并不像它可能那样简单。...它像我们今天看到的所有代码一样是非阻塞的,所以其他的东西可以在等待表达式的同时运行。然而,在promise等待解决之前,下一行代码将不会运行。...编写顶级代码时,可以使用promises的then语法代替,可以将代码封装在标记为异步的自执行函数中 总结 整篇文章主要是针对如何序列化js中的并发操作,其中序列化也就是编码方式,用什么的方式将要用的方式给存起来

3.1K20

停止在 JavaScript 中使用 Promise.all()

有趣的是,当 promise 被创建时,其值可能不会立即可用。...此方法接受一个 promises 数组并返回一个统一的 promise。关键是,只有当所有输入的 promises 都成功解决时,这个组合的 promise 才会解决。...增强的用户体验 通常,为用户提供必要的部分结果和错误通知要比使用某些通用消息使整个操作失败更好。Promise.allSettled() 使这种方法易于实施。...然后,使用 Promise.all(tasks) 顺序执行任务,并使用 then() 处理所有任务成功的结果。...Promise.allSettled() 适用于处理多个独立的异步操作,并提供完整的结果信息和灵活的错误处理;而 Promise.all() 更适用于特定顺序执行任务,并在任何一个任务失败时快速终止并处理错误

7910

Promise 毁掉地狱

}) demo2地址:并发请求 – Promise.all(https://wheato.github.io/demo/promise-demo/demo2.html) 并发请求,顺序处理结果 Promise.all...上节中的代码 const promises = urls.map(loadImg) 运行后,全部都图片请求都已经发出去了,我们只要按顺序挨个处理 promises 这个数组中的 Promise 实例就好了...而用上一节的方法,我们既能并发请求,又能顺序响应图片加载完成的事件。...`) }) } return step } 上面代码里的 for 可以改成 reduce ,不过需要先将需要加载的 urls 分步的数目,划分成数组,感兴趣的朋友可以自己写写看。...使用递归 假设我们的最大并发数是 4 ,这种方法的主要思想是相当于 4 个__单一请求__的 Promise 异步任务在同时运行运行,4 个单一请求不断递归取图片 URL 数组中的 URL 发起请求,直到

1.9K20

SQL查询并不总是以SELECT开始

SQL查询顺序发生 我研究了一下,执行顺序如下所示。SELECT 并不是第一个执行的,而是第五个。 ?...实际上,数据库引擎并不一定按照这个顺序执行查询,因为为了使查询运行更快,实现了一系列优化。所以: 当我们只想了解哪些查询是合法的以及如何推理给定查询的返回结果时,可以参考上图。...当我们在推断查询性能或者包含索引的任何东西时,上图就不适用了。 3....我们的数据库引擎会进行一系列的检查,以确保在运行查询之前,我们在 SELECT 和 GROUP BY 中输入的内容是合法的,因此在生成执行计划之前必须从整体上检查一下查询。 4....查询可能不会上述顺序运行 实际上,数据库引擎并不一定会按照 JOIN、WHERE、GROUP BY 的顺序来执行查询,因为它们会进行一系列优化,只要重新排序不会改变查询的结果,它们就会对命令进行重新排序以使查询运行得更快

1.1K20
领券