面试题-为什么要使用Promise,Promise的优点
面试题 使用 为什么 优点 Promise
2023-06-13 09:14:10 时间
1.指定回调函数的方式更加灵活: 旧的: 必须在启动异步任务前指定 promise: 启动异步任务 => 返回promie对象 => 给promise对象绑定回调函数(甚至可以在异步任务结束后指定)
假设现在有一个名为 createAudioFileAsync() 的函数,如果给出一些配置和两个回调函数,这个函数能异步地生成音频文件。一个回调函数是文件成功创建时的回调,另一个则是出现异常时的回调。
不使用Promise,回调函数必须先指定
// 成功的回调函数
function successCallback (result) {
console.log('声音文件创建成功: ' + result)
}
// 失败的回调函数
function failureCallback (error) {
console.log('声音文件创建失败: ' + error)
}
/* 1.1 使用纯回调函数 */
createAudioFileAsync(audioSettings, successCallback, failureCallback)
使用Promise
const promise = createAudioFileAsync(audioSettings)
promise.then(successCallback, failureCallback)
// 可简写为
createAudioFileAsync(audioSettings).then(successCallback, failureCallback);
可以在异步操作完成后再指定回调函数
setTimeout(() => {
promise.then(successCallback, failureCallback)
}, 3000)
2.支持链式调用(将异步操作以同步操作的流程表达出来), 可以解决回调地狱问题 什么是回调地狱? 回调函数嵌套调用, 外部回调函数异步执行的结果是嵌套的回调函数执行的条件 回调地狱的缺点? 不便于阅读 / 不便于异常处理 解决方案? promise链式调用 终极解决方案? async/await
回调地狱
doSomething(function (result) {
doSomethingElse(result, function (newResult) {
doThirdThing(newResult, function (finalResult) {
console.log('Got the final result: ' + finalResult)
}, failureCallback)
}, failureCallback)
}, failureCallback)
使用promise的链式调用解决回调地狱
doSomething().then(function (result) {
return doSomethingElse(result)
})
.then(function (newResult) {
return doThirdThing(newResult)
})
.then(function (finalResult) {
console.log('Got the final result: ' + finalResult)
})
.catch(failureCallback)
======
// 箭头函数写法
doSomething()
.then(result => doSomethingElse(result))
.then(newResult => doThirdThing(newResult))
.then(finalResult => {
console.log(`Got the final result: ${finalResult}`)
})
.catch(failureCallback)
async/await: 回调地狱的终极解决方案
async function request () {
try {
const result = await doSomething()
const newResult = await doSomethingElse(result)
const finalResult = await doThirdThing(newResult)
console.log('Got the final result: ' + finalResult)
} catch (error) {
failureCallback(error)
}
}
Promise的缺点
- 无法取消
Promise
,一旦新建它就会立即执行,无法中途取消。 - 如果不设置回调函数,
Promise
内部抛出的错误,不会反应到外部。 - 当处于
pending
状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)
const someAsyncThing = function() {
return new Promise(function(resolve, reject) {
// 下面一行会报错,因为x没有声明
resolve(x + 2);
});
};
someAsyncThing().then(function() {
console.log('everything is great');
});
setTimeout(() => { console.log(123) }, 2000);
// Uncaught (in promise) ReferenceError: x is not defined
// 123
上面代码中,someAsyncThing函数产生的 Promise 对象,内部有语法错误。浏览器运行到这一行,会打印出错误提示ReferenceError: x is not defined,但是不会退出进程、终止脚本执行,2 秒之后还是会输出123。这就是说,Promise 内部的错误不会影响到 Promise 外部的代码,通俗的说法就是“Promise 会吃掉错误”。
相关文章
- sql优化的几种方法面试题_mysql存储过程面试题
- 线程池面试题一般会怎么问?线程池面试题总结及答案整理
- 腾讯前端一面必会面试题合集
- 面试题回顾:Spring MVC 怎么使用xml传参?
- Mybatis01入门+使用和配置+面试题mybatis与hibernate的区别+ssm与ssh2开发对比
- vue07登陆注册--跨域请求问题+ base64编码+axios使用+面试题【v-bind和v-modul和{{}}的区别】
- 前端面试题 --- Vue部分
- 面试题:深拷贝和浅拷贝(超级详细,有内存图)
- 20道前端高频面试题(附答案)
- 高级前端一面常考手写面试题指南
- 【面试题】近期学员被问最多的真实面试题记录(如何分配测试任务?)
- 面试题:接口和抽象类的区别是什么?
- 这样回答前端面试题才能拿到offer2
- React常见面试题
- 2023前端二面vue面试题_2023-02-23
- MySQL面试题大全精选SQL技巧考察,必备职场技能(mysql中sql面试题)