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

2,482 阅读3分钟

第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译站