JavaScript Promise实例方法

请解释以下实例方法的作用,并举例说明使用方法

Promise.prototype.then
Promise.prototype.done
Promise.prototype.always
Promise.prototype.fail

在下列Promise所提供的方法中,用来向成功或者失败的回调函数队列中添加回调函数的是( )
A. done
B. then
C. always
D. fail

这些文档里都有,我就直接抄文档了,那个选择题,选择B,文档一看都清楚了。


Promise.prototype.then(onFulfilled, onRejected)
该方法用于注册一个回调函数,当Promise对象成功(fulfilled)时,会执行 onFulfilled 回调函数,并传递Promise对象的结果作为参数;当Promise对象失败(rejected)时,会执行 onRejected 回调函数,并传递Promise对象的拒因作为参数。该方法返回一个新的Promise对象,该新Promise对象的状态和结果由回调函数的返回值决定。
例如:

const promise = new Promise((resolve, reject) => {
  // 一些异步操作
  setTimeout(() => {
    const result = 'Success!';
    resolve(result);
  }, 1000);
});

promise.then((result) => {
  console.log(result); // 'Success!'
}).catch((error) => {
  console.error(error);
});
Promise.prototype.done(onFulfilled, onRejected)
该方法与 then() 方法类似,但是不返回一个新的Promise对象,也没有捕获错误的机制。相反,它在发生未处理的错误时,将错误直接抛出,使其在全局范围内捕获。
例如:

const promise = new Promise((resolve, reject) => {
  // 一些异步操作
  setTimeout(() => {
    const result = 'Success!';
    resolve(result);
  }, 1000);
});

promise.done((result) => {
  console.log(result); // 'Success!'
}, (error) => {
  console.error(error);
});
Promise.prototype.always(onFinally)
该方法注册一个回调函数,该回调函数在Promise对象完成(resolved)时执行,无论Promise对象是成功还是失败。回调函数没有参数,也不会影响Promise对象的状态或结果。该方法返回一个新的Promise对象,该新Promise对象与原Promise对象状态和结果相同。
例如:

const promise = new Promise((resolve, reject) => {
  // 一些异步操作
  setTimeout(() => {
    const result = 'Success!';
    resolve(result);
  }, 1000);
});

promise.then((result) => {
  console.log(result); // 'Success!'
}).catch((error) => {
  console.error(error);
}).finally(() => {
  console.log('Promise completed.'); // 'Promise completed.'
});
Promise.prototype.fail(onRejected)
该方法与 then() 方法类似,但只注册处理Promise对象失败的回调函数。它返回一个新的Promise对象,该新Promise对象的结果由回调函数的返回值决定。
例如:

const promise = new Promise((resolve, reject) => {
  // 一些异步操作
  setTimeout(() => {
    const error = new Error('Error!');
    reject(error);
  }, 1000);
});

promise.fail((error) => {
  console.error(error.message); // 'Error!'
});

Promise.prototype.then方法可以传递两个参数,分别是两个函数succe=>{},err=>{},可以处理resolve和reject的两种情况第二个参数可以不写

  • 这篇博客: JavaScript手写代码面试题中的 1.用promise实现图片的异步加载 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •     let imageAsync = (url) => {
          return new Promise((resolve, reject) => {
            let img = new Image();
            img.src = url;
            img.onload = () => {
              console.log('图片请求成功,此处理进行通用操作')
              resolve(image)
            }
            img.onerror = (err) => {
              console.log('失败,处处进行失败的通用操作')
              reject(err)
            }
          })
        }
    
        imageAsync("url").then(() => {
          console.log("加载成功")
        }, () => {
          console.log("加载失败")
        })