1. Promise.resolve()
返回一个fulfilled
的Promise
实例,或原始Promise
实例。
- 参数为空,返回一个状态为
fulfilled
的Promise
实例 - 参数是一个跟
Promise
无关的值,同上,不过fulfilled
响应函数会得到这个参数 - 参数为
Promise
实例,则返回该实例,不做任何修改 - 参数为
thenable
,立刻执行它的.then()
示例代码如下:
console.log('start'); // eslint-disable-line
Promise.resolve().then((value)=>{
console.log('Step 1',value); // eslint-disable-line
return Promise.resolve('Hello');
}).then(value=>{
console.log(value,'world'); // eslint-disable-line
return Promise.resolve(new Promise(resolve => {
setTimeout(()=>{
resolve('Good');
},2000);
}));
}).then(value=>{
console.log(value,'evening'); // eslint-disable-line
return Promise.resolve({
then(){
console.log(',everyone'); // eslint-disable-line
}
})
})
结果:
原因分析:一开始未给value
值,所以输出undefined
,再下一步resolve
对象时,并不会改变Promise
的状态,所以顺序执行输出结果。
2. Promise.race()
类似Promise.all()
,区别在于它有任意一个完成就算完成。 将两个Promise
实例放在数组中传给Promise.race
,运行:
console.log('start'); // eslint-disable-line
let p1 = new Promise(resolve => {
setTimeout(()=>{
resolve('I\'m P1');
},3000);
});
let p2 = new Promise(resolve => {
setTimeout(()=>{
resolve('I\'m P2');
},1000)
});
Promise.race([p1,p2])
.then(value => {
console.log(value); // eslint-disable-line
})
运行结果:
Promise.race()
常见用法:
- 把异步操作和定时器放在一起
- 如果定时器先触发,就认为超时,告知用户。比如从远程的服务器加载数据,就可以设置定时器,在规定时间后加载的数据还没有返回,就告知用户。
3. Promise浏览器兼容性如下:
除了IE支持性较差外,别的大部分浏览器都支持原生Promise
:
4. 新增运算符:async/await
异步函数是在Promise
上的进一步改进,赋予了JavaScript
以顺序手法编写异步脚本的能力。 既保留异步运算的无阻塞特性,还能继续使用同步写法,还能正常使用return/try/catch
,async/await
仍在Promise
基础上实现的。
如下基本使用:
function resolveSecond(x){
return new Promise(resolve => {
setTimeout(()=>{
resolve(x);
},2000);
});
}
async function f1(){
var x = await resolveSecond(10);
console.log('x',x); // eslint-disable-line
}
f1();
两秒后输出:x 10
5. 总结
通过Promise相关核心概念的学习,发现其实其基本请求处理并不难,但是结合项目中数据请求、嵌套等依赖关系,加之业务逻辑的复杂度,实现起来往往会晕头转向,应该结合项目多实践多模拟才能对数据请求处理更好地把控。
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!