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

为什么Promise中的Promise.resolve会在Promise之前执行?

Promise中的Promise.resolve会在Promise之前执行的原因是因为Promise.resolve是一个立即执行的静态方法,它会立即返回一个已解决(resolved)的Promise对象。

在JavaScript中,Promise.resolve方法用于创建一个已解决的Promise对象,该对象的解决值(resolved value)是传递给Promise.resolve方法的参数。如果参数本身就是一个Promise对象,Promise.resolve会直接返回这个Promise对象。

当调用Promise.resolve方法时,它会立即执行并返回一个已解决的Promise对象。这意味着在执行Promise.resolve之前,它的参数已经被计算和解析了。因此,即使在Promise链中调用Promise.resolve方法,它也会在后续的Promise对象之前执行。

这种设计使得在Promise链中可以方便地将非Promise值转换为Promise对象,并且确保在后续的Promise对象中能够正确处理这些值。

举个例子,假设有一个返回Promise对象的函数foo,我们可以使用Promise.resolve将一个非Promise值转换为Promise对象,并将其作为foo函数的参数:

代码语言:txt
复制
const value = 42;
const promise = Promise.resolve(value);

promise.then(result => {
  console.log(result); // 输出: 42
});

function foo(promise) {
  return promise.then(result => {
    console.log(result); // 输出: 42
  });
}

foo(promise);

在上面的例子中,Promise.resolve将非Promise值42转换为一个已解决的Promise对象,并将其赋值给变量promise。然后,我们可以通过调用promise.then方法来处理这个已解决的Promise对象的解决值。

总结起来,Promise.resolve会在Promise之前执行是因为它是一个立即执行的静态方法,用于将非Promise值转换为已解决的Promise对象。这种设计使得在Promise链中能够方便地处理非Promise值,并确保它们在后续的Promise对象中能够正确处理。

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

相关·内容

JavaScriptPromise代码为什么比setTimeout先执行

在 ES3 和更早版本,JavaScript 本身还没有异步执行代码能力,这也就意味着,宿主环境传递给 JavaScript 引擎一段代码,引擎就把代码直接顺次执行了,这个任务也就是宿主发起任务...Promise then 回调是一个异步执行过程,下面我们就来研究一下 Promise 函数执行顺序,我们来看一段代码示例: var r = new Promise(function(resolve...在进入 console.log(“b”) 之前,毫无疑问 r 已经得到了 resolve,但是 Promise resolve 始终是异步操作,所以 c 无法出现在 b 之前。...在这段代码,我设置了两段互不相干异步操作:通过 setTimeout 执行 console.log(“d”),通过 Promise 执行 console.log(“c”)。...在每个宏任务,分析有多少个微任务; 3. 根据调用次序,确定宏任务微任务执行次序; 4. 根据宏任务触发规则和调用次序,确定宏任务执行次序; 5.

83420

Promise、setTimeout执行顺序

同步和异步任务 ​ 要了解异步线程我们首先应该明白它用处,因为js单线程特性,任务执行顺序都是依次执行,而当我们在工作遇到网络请求,前后端交互时候,你数据不会马上拿到,这需要时间,如果等拿到数据再执行下面的代码...() }).then(() => { console.log(4) }) 首先来分析下,这段代码包含同步任务,包含异步宏任务setTimeout,包含异步微任务promise,这套题答案是...queue 记一个任务 setTimeout1 然后碰到 promise 微任务, 直接执行 new Promise 输出 5, 并将 then 函数回调函数推入 micro Task event...queue , micro Task event queue 记 一个 微任务 promise1 又遇到了 setTimeout 宏任务, 同理,将其回调函数推入 macro Task event...1 5 10 了, 按照我们之前所说,这个时候,主线程会去检查 是否存在微任务,不难发现,这个时候 event queue 是这个样子 micro Task (微任务) macro Task(宏任务

64120

面试题-为什么要使用PromisePromise优点

1.指定回调函数方式更加灵活: 旧: 必须在启动异步任务前指定 promise: 启动异步任务 => 返回promie对象 => 给promise对象绑定回调函数(甚至可以在异步任务结束后指定...回调函数嵌套调用, 外部回调函数异步执行结果是嵌套回调函数执行条件 回调地狱缺点? 不便于阅读 / 不便于异常处理 解决方案? promise链式调用 终极解决方案?...缺点 无法取消Promise,一旦新建它就会立即执行,无法中途取消。...) ReferenceError: x is not defined // 123 上面代码,someAsyncThing函数产生 Promise 对象,内部有语法错误。...这就是说,Promise 内部错误不会影响到 Promise 外部代码,通俗说法就是“Promise 会吃掉错误”。

56120

JavaScript return await promise 与 return promise

原文地址:'return await promise' vs 'return promise' in JavaScript 原文作者:Dmitri Pavlutin 译文出自:掘金翻译计划 当从异步功能返回时...相同行为 为了找到两个表达式(与)区别,(return await promise vs return promise), 我要使用辅助功能。 delayedDivide(n1, n2)....(new Error("Cannot divide by 0")); } else { return Promise.resolve(n1 / n2); } } 复制代码 如果第二个(二维索)论点是...在此步骤,您已经看到使用和没有区别 return await promise and return promise 至少在处理成功履行承诺时。 但是,让我们搜索更多! 2....return await promiseawait `catch(error) {...}声明捕获只等待拒绝承诺在声明。try {...} 喜欢这个帖子?请分享!

2K20

JavaScript执行(一):Promise代码为什么比setTimeout先执行

在 ES3 和更早版本,JavaScript 本身还没有异步执行代码能力,这也就意味着,宿主环境传递给 JavaScript 引擎一段代码,引擎就把代码直接顺次执行了,这个任务也就是宿主发起任务...Promise then 回调是一个异步执行过程,下面我们就来研究一下 Promise 函数执行顺序,我们来看一段代码示例: var r = new Promise(function(resolve...在进入 console.log(“b”) 之前,毫无疑问 r 已经得到了 resolve,但是 Promise resolve 始终是异步操作,所以 c 无法出现在 b 之前。...在这段代码,我设置了两段互不相干异步操作:通过 setTimeout 执行 console.log(“d”),通过 Promise 执行 console.log(“c”)。...在每个宏任务,分析有多少个微任务; 3. 根据调用次序,确定宏任务微任务执行次序; 4. 根据宏任务触发规则和调用次序,确定宏任务执行次序; 5.

58310

JavaScriptPromise

这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现结果promise对象 2.作用 1、主要用于异步计算。...2、可以将异步操作队列化,按照期望顺序执行,返回符合预期结果。 3、可以在对象之间传递和操作promise,帮助我们处理队列。...回调会在当前promise运行完毕后被调用,无论当前promise状态是完成(fulfilled)还是失败(rejected) 7.catch()方法 Promise.prototype.catch...另外,then方法指定回调函数,如果运行抛出错误,也会被catch方法捕获。...Promise 填充过程都被日志记录(logged)下来,这些日志信息展示了方法同步代码和异步代码是如何通过Promise完成解耦

1.1K20

Promisethen链机制

第三类:Promise.resolve(100) 返回一个状态是成功,值是100promise实例Promise.reject(0) 返回一个状态是失败,值是0promise实例只要实例状态和值我们分析好...---->我们应该去执行onfulfilled或者onrejected,但是不是立即执行,它是一个异步微任务首先,把执行对应方法这个事情放在WebAPI监听,但是因为此时已经知道状态了,对应方法可以执行...---->我们把onfulfilled或者onrejected先存储起来,只有当后面我们把实例状态修改为成功/失败时候,再取出之前存储方法,把其执行【而且此时再执行,还是个异步微任务】还是要经历:...;执行Promise.all返回一个新promise实例@p并且传递一个数组,数组包含n多其他promise实例如果数组每一个promise实例最后都是成功状态,则@p也会是成功,它值也是一个数组...,类似于异步改为同步效果】如果后面放不是promise实例,则浏览器默认会把其转换为“状态为成功,值就是这个值”实例await 10; --> await Promise.resolve(10);我正在参与

14420

关于 JavaScript Promise

Promise构造函数,我们传递了一个执行器函数,这个函数接受两个参数:resolve和reject,它们是由JavaScript引擎提供回调函数。...链式调用(Chained Promise)链式调用(Chained Promise)是一种用于处理异步操作序列技术,在JavaScript,它允许按顺序执行多个异步操作,并且可以在每个操作完成后执行下一个操作...我们使用 Promise.race() 来让它们竞速,如果 cancellationPromise 在 asyncOperation 之前完成,那么就会执行取消操作。...与 Promise.all() 方法不同,Promise.allSettled() 不会在有任何一个 Promise 被拒绝时返回一个拒绝 Promise。...这也是为什么 Promise 成为现代 JavaScript 异步编程标准之一。

54863

settimeout(fn 0)与Promise执行顺序

而像settimeout、ajax等异步操作回调,会进入”任务队列“,而且只有主线程没有执行任何同步代码前提下,才会执行异步回调。...新建后立即执行,也就是说,Promise构造函数里代码是同步执行。...可能你还有一个疑惑,那就是为什么then比setTimeout执行要早呢? 目前有两种原因导致: 1) setTimeout0是否真的为0?...接着, 会先执行 macrotask 第一个任务(整个 script同步代码 ),再加上promise 构造函数也是同步promise.then 回调被推进到 microtask 队列),...此时,microtask 队列任务已经执行完毕,所以执行剩下 macrotask 队列任务,也就是 setTimeout, 所以打印出 1.

1.3K30

JavaScriptPromise使用详解

那么如何解决地狱回调,保持我们代码简短,这时Promise就出场了,Promise对象可以理解为一次执行异步操作,使用Promise对象之后可以使用一种链式调用方式来组织代码;让代码更加直观。...Promise正如字面意思-承诺,“承诺将来会执行”约定事情。我们首先需要了解Promise三种状态: pending: 初始状态,既不是成功,也不是失败状态。...Resolve函数作用是,将Promise对象状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作结果,作为参数传递出去; Reject...函数作用是,将Promise对象状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出错误,作为参数传递出去。...Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态回调函数。

1.3K1513

JSCallback VS Promise

这篇文章不会讨论使用async / await执行Promise(尽管它们在功能上是一样,但在大多数情况下 async/await 才是真正语法糖)。...冷知识 实际上,在JavaScript原生之前,承诺就已经存在了一段时间。例如,在promises成为原生之前实现该模式两个库是Q和when。 那么什么是Promise?...所以,我们为什么需要JSPromise? 为了明白这个问题,我们得先来聊聊为什么在大多数JS开发者,仅仅使用CallBack方法是远远不够。...再将结果.then存储到LocalStarage之前,它将在处理程序以数组形式检索结果: const getFrogs = new Promise((resolve) => { resolve([...,这个Promise会在所有给定Promise都已解决或被拒绝后最终解决,并将结果累积到每个项目代表其promise操作结果数组。

5.1K21

iOS Promise 设计模式

Promise 设计模式原理 Promise设计模式把每一个异步操作都封装成一个Promise对象,这个Promise对象就是这个异步操作执行完毕结果,但是这个结果是可变,就像薛定谔猫,只有执行了才知道...另外还有其它几个关键字用来表示一个Promise对象状态: pending: 任务执行,状态可能会进入下面的fullfill或者reject二者之一 fufill/resolved: 任务完成了,返回结果...一个Promise执行完毕之后,无论状态是变成resolve还是pending,都通过这个方法,执行对应 then,并返回一个Promise对象。...上面的函数,有一个dispatchBarrierSync,barrier是栅栏意思,一般来说如果我们有多个异步任务,但是希望他们按照一定顺序执行,就可以使用这个方法。...在这个barrier方法内部,一个是会去看当前是否已经有下一个要执行Promise,如果没有就生成一个新,另一个把对应pending 放到handler队列,依次执行

1.4K00

iOS Promise 设计模式

Promise 设计模式原理 Promise设计模式把每一个异步操作都封装成一个Promise对象,这个Promise对象就是这个异步操作执行完毕结果,但是这个结果是可变,就像薛定谔猫,只有执行了才知道...另外还有其它几个关键字用来表示一个Promise对象状态: pending: 任务执行,状态可能会进入下面的fullfill或者reject二者之一 fufill/resolved: 任务完成了...最终都会执行回调 when: 多个异步任务执行完毕之后才会回调 Promise模式实现 Promise设计模式在 iOS/MacOS 平台最佳实践是由大名鼎鼎homebrew作者 Max...一个Promise执行完毕之后,无论状态是变成resolve还是pending,都通过这个方法,执行对应 then,并返回一个Promise对象。...上面的函数,有一个dispatchbarriersync ,barrier是栅栏意思,一般来说如果我们有多个异步任务,但是希望他们按照一定顺序执行,就可以使用这个方法

4K10

面试官:为什么Promise错误不能被trycatch?

前言 之前我写过一篇文章,讨论了为什么async await错误可以被try catch,而setTimeout等api不能,有小伙伴提出之前面试被面试官问过为什么Promise错误不能try catch...异步处理在我们日常开发是很常见场景,在Promise出现之前,我们都是通过回调来处理异步代码结果,但是出现了一些问题: 回调地狱,在有多个异步逻辑存在依赖关系时,我们只能在回调里嵌套,这些深度嵌套代码让代码难以阅读和维护...我们也不能直接拿到Promise状态,只能通过注册handler方式,Promise会在恰当时机调用这些handler,JavaScript Promise可以注册三种handler: then...Promise.resolve Promise.resolve(x)等价于 x instanceof Promise?...它也会返回一个新Promise,然后它状态也是根据之前Promise以及handler执行结果决定。不过finally handler能做事相比而言更有限。

1.4K30

JavaScriptAsyncAwait和Promise区别

下面通过简单示例方式来讲讲Async/Await和Promise区别。 简单介绍下Async/Await: Async/Await是一种新编写异步代码方式。...其他方式是回调或者Promise。 Async/Await实质是构建在Promise之上,它不能用于纯回调或者Node.js回调。...await关键字只能用在async标记函数内,换句话说它是不能用在代码最顶层。await意思是等待getJSON()返回Promise被处理了才会执行。...与Promise对比简洁干净 与Promise需要使用then()函数来处理Promise返回结果,而async/await则直接在代码按顺序上处理结果,代码量减少同时,显得更简洁。...Promise如果在then()函数里出现异常,在Promise外面的try/catch是捕获不到,这种情况我们需要使用Promisecatch()函数。

2.7K20
领券