我的编程空间,编程开发者的网络收藏夹
学习永远不晚

一文总结JavaScript中Promise遇到的问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

一文总结JavaScript中Promise遇到的问题

什么是Promise

国内比较流行的看法:

阮一峰: Promise 对象

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。

Promise 真正的规范,推荐大家看看这篇长文:promisesaplus.com/

1. 是否可以使用return 代替 resolve

不可以,无法实现链式调用,且不符合规范。

示例:

const testReturn = (a:boolean):Promise<any> =>{
    return new Promise((resolve,reject)=>{
        if(a){
            return 'this is return';
            resolve('true');
            console.log('this will not be exec');
            throw new Error('error');
        }else{
            reject('false');
        }
    })
}

执行结果:

 ~ ts-node return.ts
Promise { <pending> }
  • 无法改变状态
  • 无法链式调用

2. 使用throw还是reject?

答案: 使用reject而不是throw

示例1:不会被catch的throw Error

const testReturn = (a:boolean):Promise<any> =>{
    return new Promise((resolve,reject)=>{
        if(a){
            resolve('true');
            console.log('this will be exec');
            throw new Error('error');
        }else{
            reject('false');
        }
    })
}

console.log(testReturn(true));

执行结果

 ~/chen/FE/winSep/codes/javascript/es6promise/class="lazy" data-src  ts-node return.ts
this will be exec
Promise { 'true' }

解释:

Promise的构造函数,以及被 then 调用执行的函数基本上都可以认为是在 try…catch 代码块中执行的,所以在这些代码中即使使用 throw ,程序本身也不会因为异常而终止。Promise的状态也不会发生改变。

示例2:不使用reject而使用throw

如果在Promise中使用 throw 语句的话,会被 try...catch 住,最终promise对象也变为Rejected状态。

var promise = new Promise(function(resolve, reject){
    throw new Error("message");
});
promise.catch(function(error){
    console.error(error);// => "message"
});

运行

Error: message

代码像这样其实运行时倒也不会有什么问题,但是如果想把 promise 设置为Rejected状态的话,使用 reject 方法则更显得合理。

所以上面的代码可以改写为下面这样。

var promise = new Promise(function(resolve, reject){
    reject(new Error("message"));
});
promise.catch(function(error){
    console.error(error);// => "message"
})

总结:如果在Promise中使用 throw 语句的话,会被 try...catch 住,最终promise对象也变为Rejected状态。

3. Promise的执行时间

3.1 resolve后面的代码会不会被执行?

当没有Error的时候, resolve会将Promise.then放在微任务队列中,当所有的宏任务执行结束的时候,执行微任务队列。

const testReturn = (a:boolean):Promise<any> =>{
    return new Promise((resolve,reject)=>{
        if(a){
            resolve('exec true');
            console.log('this will be exec');
            // throw new Error('error');
        }else{
            reject('false');
        }
    })
}
testReturn(true).then(str=>{
    console.log(str);
})

执行结果

this will be exec
exec true

当有Error的时候,Error后面的代码不会被执行,但是Promise的结果依旧是fulfilled

const testReturn = (a:boolean):Promise<any> =>{
    return new Promise((resolve,reject)=>{
        if(a){
            resolve('exec true');
            console.log('this will be exec');
            throw new Error('error');
            console.log('this will not be exec')
        }else{
            reject('false');
        }
    })
}


testReturn(true).then(str=>{
    console.log(str);
    // console.log(testReturn)
}).catch(err=>{
    console.log('err: ',err);
})

执行结果

this will be exec
exec true

3.2 当Promise遇到setTimeout

看例子:

const testReturn = (a:boolean):Promise<any> =>{
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            if(a){
                resolve('exec true');
                console.log('this will be second exec');
            }else{
                reject('false');
            }
        })
        console.log('this will first be execd');
    })
}


testReturn(true).then(str=>{
    console.log(str);
    // console.log(testReturn)
}).catch(err=>{
    console.log('err: ',err);
})

结果

this will first be execd
this will be second exec
exec true

解释:

时间宏任务队列微任务队列
1console.log('this will first be execd')
2setTimeout
3resolve('exec true');//延迟:因为宏任务没有执行完
4console.log('this will be second exec');

最终执行顺序:

1->2->4(宏任务结束)->3(微任务结束)

 

3.3 async/await 与Promise

一句话总结: await等的就是一个Promise 。如果等的不是Promise ,那加了await和不加没区别

  • 将常规的回调转变为Promise的方法

function util(args,callback){
    if(err){
        return callback(err);
    }else{
        return callback();
    }
}

//调用
util(args,(err)=>{
    if(err){
        
    }else{
        
    }
})
//Promisify

function utilPromise(args){
    return new Promise((resolve,reject)=>{
        if(err){
            reject(err)
        }else{
            resolve();
        }
    })
}

//调用
 utilPromise.then().catch()
  • Promise转换为async/await的方法

async init(){
    try{
        await utilPromise();//resolve状态
    }catch(e){
        throw new Error(e); //reject状态
    }	
}

到此这篇关于一文总结JavaScript中Promise遇到的问题的文章就介绍到这了,更多相关JavaScript Promise内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

一文总结JavaScript中Promise遇到的问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

一文总结JavaScript中Promise遇到的问题

Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。本文将总结一下在Promise中容易遇到的一些问题,感兴趣的同学可以参考下
2023-05-18

Spring Security中使用authorizeRequests遇到的问题小结

Spring 是非常流行和成功的 Java 应用开发框架,Spring Security 正是 Spring 家族中的成员,这篇文章主要介绍了Spring Security中使用authorizeRequests遇到的问题,需要的朋友可以参考下
2023-02-03

JavaScript中遇到的错误问题怎么解决

本篇内容介绍了“JavaScript中遇到的错误问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Demo演示每个按钮都会引发一个“
2023-06-02

Python中遇到的小问题及解决方法汇总

本文会把学习过程中遇到的一些小问题和解决办法放在这里,以便于大家能够更好地学习python。 一、Python的异常处理 因为想到自己不断尝试写小程序的话会用到抛出异常信息来判断哪里出现了问题:usage: raise [Exception
2022-06-04

redis性能优化之生产中实际遇到的问题及排查总结

这篇文章主要介绍了redis性能优化之生产中实际遇到的问题及排查总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-12-22

一文总结JavaScript中常见的设计模式

在程序设计中有很多实用的设计模式,而其中大部分语言的实现都是基于“类”。在程序设计中有很多实用的设计模式,而其中大部分语言的实现都是基于“类”。,本文将总结了JavaScript中常见的十五种设计模式,感兴趣的朋友可以参考下
2023-05-19

在 Vue 中使用 dhtmlxGantt 组件时遇到的问题汇总(推荐)

dhtmlxGantt一个功能丰富的甘特图插件,支持任务编辑,资源分配和多种视图模式,这篇文章主要介绍了在 Vue 中使用 dhtmlxGantt 组件时遇到的问题汇总,需要的朋友可以参考下
2023-03-19

编程热搜

目录