Promise

promise对象代表了异步操作的执行结果,异步操作于将来某个时间点执行完毕,它有可能成功也有可能失败。

例如,当你发出一个请求到服务器,你可以返回一个promise对象来代表这个请求的结果。这个请求有可能成功,也有可能失败,但无论如何,你都有一个可用的promise对象。下面的函数发出了一个服务器请求,并通过promise的形式返回了结果:

code/promises/axios-example.js

const axios = require('axios')
function getDataFromServer() {
  const result = axios.get('https://jsonplaceholder.typicode.com/posts/1')
  return result
}

在第1行中,我们加载了axios模块,它是一个基于promise的HTTP库。
在第 3 行中,我们对一个公开的api接口发出了Get请求,并把返回值保存到了一个result常量中。
在第 4 行中,我们返回了一个promise对象。

现在,我们可以非常简单地调用这个函数,获取其请求结果,并捕获可能出现的错误:

getDataFromServer()
  .then(function(response) {
    console.log(response)
  })
  .catch(function(error) {
    console.log(error)
  })

每一个promise对象都有thencatch方法,如果异步操作成功了(promise resolved),你就可以使用then方法来获取操作结果;如果异步操作失败了(promise rejected),你可以使用catch方法来捕获错误信息。

注意,thencatch方法都接受一个回调函数,并把异步操作结果作为参数传入到回调函数中。

还有一点值得注意的是,这两个方法都返回一个promise对象,从而允许我们进行链式调用。

以下几个异步例子,都可以返回promise对象:

  • 读取文件内容:返回的promise对象会包含文件内容
  • 列出目录内容:返回的promise对象包含了文件列表
  • 解析csv文件:返回的promise对象包含了解析内容
  • 返回数据库的查询结果

下图简要的说明了promise对象可能拥有的状态:
promise 状态 - JavaScript 异步教程 - timsrc.com

用户头像
登录后发表评论