Promise

Promise

中等

简介

在Promise类出现之前,处理异步代码只有一种方式:回调模式。

回调是一个函数,它作为实参传给另一个函数,并在那个函数中的某个操作完成后被调用。这类回调函数有一个常见的模式:把“错误”作为第一个形参(见下面的示例)。

function callback(error, arg2, arg3) {}

这和异步代码有什么关系?

过去,回调一直被用来让我们在异步任务完成后做一些工作,同时不阻塞整个程序。

fetchProduct(productId, function (error, data) {
  if (error) {
    // Handle the error
  } else {
    // Do some work
  }
});

在上面的示例中,fetchProduct函数(它是异步的)接收一个回调作为第二个实参,用来决定取回商品数据后该做什么。

说明

这个练习有两个目标:

  1. 实现一个 promisify 函数,把一个使用“回调模式”的函数转换成返回Promise的函数。参见下面的例子。
function fetchProduct(productId, function(error, data) {
    if (error) {
        // Handle the error
    } else {
        // Make something with your data
    }
})

const fetchProductAsPromise = promisify(fetchProduct);

// Now you got a function `fetchProductAsPromise`
// that returns a promise
fetchProductAsPromise(productId)
    .then((data) => {})
    .catch((error) => {});
  1. 重新实现下面这些内置的 Promise 方法(不能使用它们本身)
  • all:接收一个 promise 数组,当_所有_ promise 都成功时它才成功,当_其中一个_失败时它失败。
  • allSettled:接收一个 promise 数组,当_所有_ promise 都成功或失败时它才成功。
  • race:接收一个 promise 数组,它以_第一个_成功或失败的 promise 的值来成功或失败。
  • any:接收一个 promise 数组,当_其中一个_ promise 成功时它才成功,当_所有_ promise 都失败时它失败。
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
JavaScript Exercism

准备好开始 Promise 了吗?

注册 Exercism,借助 37 个概念159 个练习 和真人导师指导,学习并掌握 JavaScript,全部免费。