Promise 和异步回调和我想的不一样

查看 160|回复 13
作者:wyc9296   
我理解的是:下面的代码会先打印123456,然后执行myfunc1函数的计算步骤,最后等待执行完毕后打印my func1。理论上主线程会先将myfunc1加入到 Promise 队列中,然后直接执行console.log(123456),最后再逐步清空任务队列、即执行myfunc1函数内 Promise 中的计算步骤。
而实际上是:先执行myfunc1函数的计算步骤,执行完毕后打印123456,最后再打印my func1。
哪里没理解对呢?
function myfunc1(){
    return new Promise((resolve,rejects)=>{
        /*这一段是计算步骤开始*/
        let i =1
        for (let index = 1; index {
    console.log(result)
})
console.log(123456)
lisongeee   
因为 Promise 的构造函数传入的函数参数是立刻执行
PaiDaTun   
```javascript
async function myfunc1() {
return new Promise((resolve, rejects) => {
/*这一段是计算步骤开始*/
let i = 1
for (let index = 1; index {
/*这一段是计算步骤开始*/
let i =1
for (let index = 1; index {
resolve("my func2")
})
}
```
onlxx123   
JavaScript 在浏览器上,不使用 WebWorker 的情况下,并没有真正意义的并行执行,只不过是一堆后续操作和一堆任务及其逻辑依赖顺序罢了。
wyc9296
OP
  
问了一下微软的 Copilot ,感觉还是不够智能:
@我:下面的代码会先打印 123456 ,然后执行 myfunc1 函数的计算步骤,最后等待执行完毕后打印 my func1 。实际是先执行 myfunc1 函数的计算步骤,执行完毕后打印 123456 ,再打印 my func1 。讲一下你的理解。
@Copilot:
这段代码的执行顺序如下:
首先,它会打印出 123456 。
然后,它会开始执行 myfunc1 函数的计算步骤。这个函数使用了 Promise 来处理异步操作。在这个函数中,它进行了一个非常大的循环计算,计算了 100000000 次,每次都将 i 乘以 index_j 。
当计算完成后,resolve("my func1") 会被调用,表示异步操作已经完成。
最后,它会打印出 my func1 。
实际上,由于 myfunc1 函数的计算步骤非常耗时,所以在执行完毕之前,它会先打印出 123456 ,然后再打印出 my func1 。
这段代码的目的是演示异步操作和 Promise 的使用。它先执行了一个耗时的计算,然后在计算完成后才执行后续的操作。
如果你还有其他问题,欢迎继续提问!
thinkershare   
@wyc9296 #4
> Promise 不是异步调用的解决方案么?你的意思是说它是同步执行的?
1. 是, 但不是最终,最终方案是 async/await + Promise
2. 不完全是
Promise 的构造函数的函数参数是立刻执行,执行完后的 Promise.then 一般是微任务执行,特殊情况 iOS 小程序是宏任务
你别老整一堆回调试图用代码上的混乱打乱思维,你直接用 async await 线性流程写法就行
wyc9296
OP
  
@thinkershare 我是直接在主机运行的 nodejs 呀、没有在浏览器上。我理解的是,它是单线程的,所以所有任务都需要排队,我对它的排队顺序有点懵。
lisongeee   
@onlxx123 确实如你所说,谢谢你
```javascript
function myfunc1_timeout(){
return new Promise((resolve,rejects)=>{
setTimeout(()=>{
/*这一段是计算步骤开始*/
let i =1
for (let index = 1; index {
console.log(result)
})
console.log(123456)
```
wyc9296
OP
  
或者你直接看相关源码实现呗,你的计算操作在 https://github.com/zloirock/core-js/blob/66e55a9183394b88b5a71c2ded58719211f4421a/packages/core-js/modules/es.promise.constructor.js#L205 可以看到被直接执行
wyc9296
OP
  
@wyc9296 nodejs 的默认行为和浏览器上没有区别。你都理解什么是后续任务了,就应该明白,调度器只保证 A->B 这种 B 总是在 A 完成 resolve 后执行,其它都是不保证的。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部