We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Promise 是一个 用来当作延迟(可能是异步的)计算的最终结果的占位符 对象。
Promise
所有 Promise 对象都会处于 fulfilled,rejected,pending 三个 互斥状态 中的一种。
p
p.then(f, r)
f
r
如果已解决 promise 或已将其“锁定”去匹配另一个 promise 的状态,则该 promise 为 resolved。尝试解决或拒绝一个已解决的 promise 没有任何影响。如果 promise 未解决,则其为 unresolved。未解决的 promise 处于 pending 状态。已解决的 promise 可能处于 pending,fulfilled 或 rejected 状态。
promise
undefined
false
this
resolve
reject
核心在于 PerformPromiseAll(iteratorRecord, C, promiseCapability, promiseResolve) 。最后一个 Promise resolve 完才会调用 resultCapability.[[Resolve]]。最后返回的是 resultCapability.[[Promise]]。
Promise resolve
Promise.all()
value
看MDN,了解下
then
boolean
new Promise((resolve, reject) => setTimeout(() => resolve(3), 3000)).then(res => console.log(res)) // 谷歌浏览器(83.0.4103.116(正式版本))立即打印 Promise { [[PromiseStatus]]: 'pending', [[PromiseValue]]: undefined } // 约3s左右打印 3 // 此时 Promise 对象变为 Promise { [[PromiseStatus]]: 'resolved', [[PromiseValue]]: undefined }
以上述代码为例,Promise 到底是如何等待异步任务完成的?如何监听到异步任务完成?
难不成浏览器底层一直在循环等待???等到异步执行完成返回结果???
其实这里就涉及到另一个知识点:事件循环。 根据 winter《重学前端》介绍,在底层的 C/C++ 代码中,这个事件循环是一个跑在独立线程中的循环,用伪代码来表示,大概是这样的:
while(TRUE) { r = wait(); execute(r); }
我们可以看到,整个循环做的事情基本上就是反复“等待 - 执行”。当然,实际的代码中并没有这么简单,还有要判断循环是否结束、宏观任务队列等逻辑,这里为了方便你理解,我就把这些都省略掉了。——抄自winter《重学前端》 Promise里的代码为什么比setTimeout先执行? 一章。
来自高级前端面试小程序
function wait() { return new Promise(resolve => setTimeout(resolve, 10 * 1000)) } async function main() { console.time(); const x = wait(); const y = wait(); const z = wait(); await x; await y; await z; console.timeEnd(); } main();
稍微有点迷惑人,但其实这三个 Promise 是差不多同时执行的,最终返回结果也就比 10000 多点吧。
改成下面:
function wait() { return new Promise(resolve => setTimeout(resolve, 10 * 1000)) } async function main() { console.time(); const x = await wait(); const y = await wait(); const z = await wait(); console.timeEnd(); } main();
修改后的代码最终结果应该比 30000 多点
The text was updated successfully, but these errors were encountered:
No branches or pull requests
控制抽象对象之Promise
Promise
是一个 用来当作延迟(可能是异步的)计算的最终结果的占位符 对象。所有
Promise
对象都会处于 fulfilled,rejected,pending 三个 互斥状态 中的一种。p
,如果p.then(f, r)
立即入队一个 任务 调用函数f
,则p
是 fulfilled 状态p
,如果p.then(f, r)
立即入队一个 任务 调用函数r
,则p
是 rejected 状态p
,如果它既不是 fulfilled 又不是 rejected,则处于 pending 状态如果已解决
promise
或已将其“锁定”去匹配另一个promise
的状态,则该promise
为 resolved。尝试解决或拒绝一个已解决的promise
没有任何影响。如果promise
未解决,则其为 unresolved。未解决的promise
处于 pending 状态。已解决的 promise 可能处于 pending,fulfilled 或 rejected 状态。Promise构造器
Promise ( executor )
undefined
,抛 TypeError 异常false
undefined
, « resolvingFunctions.[[Resolve]], resolvingFunctions.[[Reject]] »)undefined
, « completion.[[Value]] »)Promise构造器属性
Promise.all ( iterable )
this
值resolve
和reject
函数)resolve
函数)false
,将 result 设置为 IteratorClose(iteratorRecord, result)Promise.allSettled ( iterable )
Promise.all()
不同,Promise.all()
返回所有Promise
执行后的value
,但是这个方法返回所有Promise
执行后的Promise
对象!!!this
值resolve
和reject
函数)resolve
函数)false
,将 result 设置为 IteratorClose(iteratorRecord, result)Promise.race ( iterable )
this
值resolve
和reject
函数)resolve
函数)false
,将 result 设置为 IteratorClose(iteratorRecord, result)Promise.reject ( r )
this
值resolve
和reject
函数)undefined
, « r »)Promise.resolve ( x )
this
值Promise.any()
看MDN,了解下
Promise原型对象上的属性
Promise
实例的内置插槽Promise.prototype.catch ( onRejected )
this
值Promise.prototype.finally ( onFinally )
this
值Promise.prototype.then ( onFulfilled, onRejected )
this
值Promise
,抛 TypeError 异常Promise实例上的属性
then
方法调用。boolean
值,表示promise是否已有完成或拒绝处理程序;用于未处理的拒绝跟踪思考
异步
以上述代码为例,
Promise
到底是如何等待异步任务完成的?如何监听到异步任务完成?难不成浏览器底层一直在循环等待???等到异步执行完成返回结果???
其实这里就涉及到另一个知识点:事件循环。
根据 winter《重学前端》介绍,在底层的 C/C++ 代码中,这个事件循环是一个跑在独立线程中的循环,用伪代码来表示,大概是这样的:
拓展阅读
2020-07-29 补充
来自高级前端面试小程序
稍微有点迷惑人,但其实这三个
Promise
是差不多同时执行的,最终返回结果也就比 10000 多点吧。改成下面:
修改后的代码最终结果应该比 30000 多点
The text was updated successfully, but these errors were encountered: