感觉 Promise 跟异步没有关系啊!我理解的异步是 ajax 这样的,ajax 将请求发出去之后,代码就继续往下执行了,等到 ajax 收到响应结果了,再回头执行 ajax 的回调函数,这才是异步。不是说你指定了回调函数就是异步。Promise 构造函数里面的代码是同步执行的,假如在 Promise 构造函数里面执行一个 10 万次的循环,主线程会等这 10 万次执行结束之后,才会继续执行下一行代码,这叫异步吗?异步跟回调函数没有一点关系。 异步就是不在主线程里面执行。

const ps = new Promise(function name(resolve, reject) { let i = 0; while(i<1000000){ i = i+1; console.log('i=',i); } }); console.log('promise 是异步吗?');

等上面这 100 万次循(最耗时的操作)环执行完,我还有必要通过 then 去指定回调函数吗?我直接执行回调函数就可以了,根本不需要通过 then 去执行回调函数。

举报· 3305 次点击
登录 注册 站外分享
31 条回复  
cookii 小成 昨天 12:56
异步和并行是两个概念,单线程也可以异步。
chiaf 小成 昨天 12:56
把异步代码放进去 Promise 本身不是异步,他只是个对象,一个容器,用于封装和管理异步操作。 设计 Promise 不是为了解决回调地狱的问题吗?
iMusic 初学 昨天 12:59
我觉得 Promise 主要解决的是回调变成了链式。 关于你举例的这个问题,看下 JS 的事件循环机制,Promise 相关哪些是微任务。
ShadowPower 小成 昨天 13:00
Promise 不提供异步机制,而是管理异步流程
renmu 该用户已被删除 昨天 13:00
提示: 作者被禁止或删除 内容自动屏蔽
Linho1219 初学 昨天 13:05
Promise 构造函数传进去的回调当然是直接同步执行的,但这个回调里面可以有网络请求,或者任何其他的“传统”的通过回调实现的异步操作,这些传统异步操作在成功或失败的时候调用 resolve reject ,实现异步代码执行结果的分发。 注意分发这个词。Promise 解决的是异步结果的分发问题,方便挂载回调而已,它本身只是一个容器。你可以将其理解为“大闸蟹券”,拿着券去领大闸蟹,但不意味着拿券和拿蟹是异步的(有螃蟹的时候也可以发券)。 因此 Promise 有两种使用方法:一种就是异步操作的 API 本身就是用 Promise 封装的,这样可以很方便地挂载回调;另一种是将传统的回调式 API 封装成 Promise ,这样可以更方便地挂载回调
yor1g 小成 昨天 13:07
promise 是回调的标准封装而已
Linho1219 初学 昨天 13:08
此外你的理解还有一个严重问题,异步回调还是在主线程中执行的,JS 是单线程的( worker 除外)。可以看看我写的这篇文章 https://notes.linho.cc/s?q=c876458647
ShadowPower 小成 昨天 13:10
另外,在不在主线程里执行并不能用来判断是不是异步。异步一般跟 IO 有关,主要用于解决线程会被 IO 阻塞的问题。 这里的 IO 可以是文件,可以是网络,也可以是用户的输入。 当然,也可以用多线程实现异步,但是并发不会很高。
1234下一页
返回顶部