转载:Promise输出题10道 加强理解

技术转载:Promise输出题10道 加强理解 转载:Promise输出题10道 加强理解1.const promise = new Promise((resolve, reject) = {conso

转载:许诺输出题10种加强理解的方法。

1.

常量承诺=新承诺((解决,拒绝)=}

console . log(1);

resolve();

console . log(2);

})

promise.then(()={)

console . log(3);

})

console . log(4);

回答

遇到Promise后立即执行,输出1,2。

执行同步代码,输出4。

执行promise.then()中的代码,并输出3。

2.

console.log('脚本开始');

setTimeout(函数(){ 0

console . log(' setTimeout ');

},0);

新承诺(功能(解析){ 0

console . log(' promise 1 ');

resolve();

console . log(' promise 2 ');

}).然后(函数(){ 0

console . log(' promise then ');

});

console.log('脚本结束');

回答

脚本开始

承诺1

承诺2

脚本结束

那么答应我

定时器

首先,JavaScript引擎将执行一个宏任务。注意,这个宏任务一般是指骨干代码本身,也就是当前的同步代码。

如果在执行过程中遇到微任务,它将被添加到微任务队列中。

宏任务执行后,立即执行当前微任务队列中的微任务,直到微任务队列清空。

微任务执行完成后,开始执行下一个宏任务。

这样重复,直到宏任务和微任务被清空。

3.

常量承诺=新承诺((解决,拒绝)=}

解析(“成功1”);

拒绝('错误');

解析(“成功2”);

});

promise .然后((RES)=}

console.log('then: ',RES);

}).catch((err)={ 0

console.log('catch: ',err);

})

回答

然后:成功1

本文研究了承诺单向传递的特征,承诺有三种状态:

悬而未决的

断然的

拒绝

这三种状态的转换只能是待定-解决或待定-拒绝。不会有解决-拒绝或待定-解决-拒绝等。也就是说,状态只能从挂起状态向一个方向转移,并且只能更改一次。

在promise中,resolve()将更改promise的状态,以便在resolve成功时调用,并且先出现已解决的状态。然后(' success1')={console.log('然后是: ',' success 1 ');})

承诺状态一旦改变,就不能修改,所以。catch()和第二次解析(“success2”)将不会执行。

4.

承诺.决心(1)。然后(2)。然后(承诺.决心(3))。然后(console.log)

回答

一个

中的参数。那么()必须是一个函数。如果是非函数,就会发生价值渗透,最后是第三种。然后将执行()函数,参数为1。

5.

承诺.决心(1)。然后((RES)=}

console.log(res)

返回2

})。catch((err)={ 0

返回3

})。然后((RES)=}

console.log(res)

})

回答

一个

2

Promise.resolve()返回一个新的承诺,并执行第一个。然后()用参数1。

打印1,返回返回带有参数2的新承诺。

执行第二个。然后用参数2()并键入。

印出 2

6.

Promise.resolve()
  .then(() = {
    return new Error('error!!!')
  })
  .then((res) = {
    console.log('then: ', res)
  })
  .catch((err) = {
    console.log('catch: ', err)
  })

答案

then:  Error: error!!!

这里的陷阱在于只有抛出错误时才会执行 .catch(),题目中并不是抛出错误,所以执行 .then()。

改成如下方式会执行 .catch():

return Promise.reject(new Error('error!!!'))
throw new Error('error!!!')

7.

const promise = Promise.resolve()
    .then(() = {
        return promise
    })
promise.catch(console.error)

答案

TypeError: Chaining cycle detected for promise #Promise

.then().catch()返回的值不能是 promise 本身,否则会造成死循环。

8.

setTimeout(() = {
    console.log(1)
    Promise.resolve(3).then(data = console.log(data))
}, 0)
setTimeout(() = {
    console.log(2)
}, 0)

答案

1
3
2

先执行整体代码,没有发现微任务;
再执行下一个宏任务—setTimeout回调函数,打印出1;
遇到微任务—Promise 回调函数;
立即执行微任务,打印出3;
微任务队列被清空,执行下一个宏任务—下一个setTimeout回调函数,打印出2。
这道题有点不一样的是,Promise 回调这个微任务,是在 setTimeout 回调这个宏任务中,被触发的。不过无论怎样,它们都遵循 Event Loop 的模型规则。

9.

var pro = new Promise((res,rej)={
  res(1);
});
pro.then(res={
  console.log(res);
});
setTimeout(()={
console.log(2);
})
pro.then(res={
  console.log(res);
})

答案

1
1
2

promise 对象赋值给了变量 pro,每个.then()都是独立的。

10.

async function async1 () {
    console.log('async1 start');
    await async2();
    console.log('async1 end');
}
async function async2 () {
    console.log('async2');
}
console.log('script start');
setTimeout(function () {
    console.log('setTimeout');
}, 0);
async1() 
new Promise (function (resolve) {
    console.log('promise1');
    resolve();
}).then (function () {
    console.log('promise2');
})
console.log('script end');

答案

script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout

定义 async1(),async2(),不会立即执行
await async2(); 表示先执行 async2(),然后将 await 后面的代码当作 .then() 中的回调来处理
初始化 promise,promise 中的代码会立即执行

总结
基本上所有与异步相关的问题都可以用 event loop 来解释。最后,我们再来回顾一遍 event loop 的执行规则:

首先执行宏任务,这个宏任务一般指 主干代码,我们经常称之为同步代码;
执行过程中如果遇到了微任务,将其加入到微任务队列中;
执行完宏任务之后,开始执行微任务队列中的任务,直至微任务队列为空;
微任务执行完之后,开始执行下一个宏任务;
如何循环执行,直到宏任务和微任务都执行完。

作者:腐烂的橘子
链接:https://leetcode-cn.com/circle/discuss/sQXY3u/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/37474.html

(0)

相关推荐

  • 删除排序数组中的重复项 ----java

    技术删除排序数组中的重复项 ----java 删除排序数组中的重复项 ----java给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。

    礼包 2021年11月4日
  • FastDFS

    技术FastDFSFastDFS,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。FastDFS1、具体内容如果现在你的系统之中需要存放大量的图片或者是视频资源

    攻略 2021年11月23日
  • jquery如何隐藏某一行

    技术jquery如何隐藏某一行这篇文章主要为大家展示了“jquery如何隐藏某一行”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jquery如何隐藏某一行”这篇文章吧。

    攻略 2021年12月13日
  • 抖音真人赞10个自助下单,介绍下抖音刷真人赞多少钱?

    技术抖音真人赞10个自助下单,介绍下抖音刷真人赞多少钱?于抖音新手怎么快速涨粉丝?
    1、大量关注别人,这样必定会带来许多的粉
    2、评论别人,不停地评论陌生人的抖音,只要看到有人发抖音就去留下高质量的评论,每次都坐上沙发,

    测评 2021年11月9日
  • python中list与字典的区别(python中list的常用方法有哪些)

    技术Python列表list与字典dict的相关操作有哪些这篇文章主要讲解了“Python列表list与字典dict的相关操作有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究

    攻略 2021年12月17日
  • 希冀的近义词,“憧憬”和“希望”是近义词吗

    技术希冀的近义词,“憧憬”和“希望”是近义词吗“憧憬”和“希望”是近义词。憧憬,读音是chōng jǐng。就是对某种事物的期待与向往。引证于现代茅盾 《创造》二:“ 君实 在二十岁时,脑中充满未来生活的憧憬。” 希望,

    生活 2021年10月29日