你真的了解 Promise 吗?来试试这几道题,专治各种不服

第1题 var p = new Promise((resolve, reject) => { reject(Error('The Fails!')) }) p.catch(error => console.log(error.message)) p.catch(error => console.log(error.message)) 输出结果是什么? A. 打印一次 'The Fails!' B. 打印两次 'The Fails!' C. UnhandledPromiseRejectionWarning D. 进程退出 例子中用构造函数创建了一个 Promise,然后用 reject 回调立即触发一个错误。.catch 处理函数跟 DOM 的.addEventListener(event, callback) 或者 Event Emitter 中的.on(event, callback)类似,可以添加多个回调函数。因此,每个回调函数都会被调用,接收的参数也是一样的。 答案:B 第2题 var p = new Promise((resolve, reject) => { return Promise.reject(Error('The Fails!')) }) p.catch(error => console.log(error.message)) p.catch(error => console.log(error.message)) 输出结果是什么? A. 打印一次 'The Fails!' B. 打印两次 'The Fails!' C. UnhandledPromiseRejectionWarning D. 进程退出 如果使用构造函数创建 Promise,必须调用resolve或者reject 。这里在构造函数中返回了一个新的 Promise,外层的 Promise 并没有用到它的返回值,内部的 Promise 后面没有.catch,因此答案是 UnhandledPromiseRejectionWarning 答案:C 第3题 var p = new Promise((resolve, reject) => { reject(Error('The Fails!')) }) .catch(error => console.log(error)) .then(error => console.log(error)) 输出结果是什么? A. 打印错误和 undefined B. 打印两次错误 C. UnhandledPromiseRejectionWarning D. undefined 当链式调用.then和.catch时,可以看成是一系列的步骤。每个 .then 接收前一个.then的返回值作为参数。但是,如果某一步碰到错误时,后续的.then都会被跳过,直到碰到一个.catch。如果要重写某个错误,只要返回一个非错误值就行了。这样它就可以被后续的.then获取到。 提示: console.log() 总是返回 undefined。 答案:A 第4题 var p = new Promise((resolve, reject) => { reject(Error('The Fails!')) }) .catch(error => console.log(error.message)) .catch(error => console.log(error.message)) 输出结果是什么? A. 打印一次错误信息 B. 打印两次错误信息 C. UnhandledPromiseRejectionWarning D. 进程退出 链式调用.catch时,每个.catch只处理前面的.then或.catch抛出的错误。这个例子中,第一个.catch 返回值是console.log,这个值只有在两个.catch后加一个.then才能拿到。 答案:A 第5题 new Promise((resolve, reject) => { resolve('Success!') }) .then(() => { throw Error('Oh noes!') }) .catch(error => { return "actually, that worked" }) .catch(error => console.log(error.message)) 输出结果是什么? A. print message once B. print message twice C. UnhandledPromiseRejectionWarning D. nothing prints .catch 可以通过返回常规值来忽略错误。这里如果再接一个.then就能获取前面的返回值了。 答案:D 第6题 Promise.resolve('Success!') .then(data => { return data.toUpperCase() }) .then(data => { console.log(data) }) A. 打印 "Success!" 和 "SUCCESS!" B. 打印 "Success!" C. 打印 "SUCCESS!" D. 不打印 这题比较简单,.then的返回值会挨个传递给后续的.then,注意一定要return。 答案:C 第7题 Promise.resolve('Success!') .then(data => { return data.toUpperCase() }) .then(data => { console.log(data) return data }) .then(console.log) A. print "SUCCESS!" B. print "Success!" C. print "SUCCESS!" and "SUCCESS!" D. nothing prints 跟前面那道题一样,这里 console.log 会调用两次。 答案:C 第8题 Promise.resolve('Success!') .then(data => { data.toUpperCase() }) .then(data => { console.log(data) }) A. print "SUCCESS!" B. print "Success!" C. print "SUCCESS!" and "SUCCESS!" D. prints undefined 这里第一个.then没有返回,所以后面的.then接收不到值。 答案:D 第9题 Promise.resolve('Success!') .then(() => { throw Error('Oh noes!') }) .catch(error => { return 'actually, that worked' }) .then(data => { throw Error('The fails!') }) .catch(error => console.log(error.message)) A. print "Oh noes!" and "The fails!" B. print "Oh noes!" C. print "The fails!" D. print "actually, that worked" E. nothing prints 很明显,第一个错误已经被第一个.catch处理了,所以第二个.catch捕获的是它前面的错误。 答案:C 获取更多技术趋势和资源,欢迎关注微信公众号:1024译站 微信公众号:1024译站

本文章由javascript技术分享原创和收集

发表评论 (审核通过后显示评论):