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对象都有then
和catch
方法,如果异步操作成功了(promise resolved),你就可以使用then
方法来获取操作结果;如果异步操作失败了(promise rejected),你可以使用catch
方法来捕获错误信息。
注意,then
和catch
方法都接受一个回调函数,并把异步操作结果作为参数传入到回调函数中。
还有一点值得注意的是,这两个方法都返回一个promise
对象,从而允许我们进行链式调用。
以下几个异步例子,都可以返回promise对象:
- 读取文件内容:返回的promise对象会包含文件内容
- 列出目录内容:返回的promise对象包含了文件列表
- 解析csv文件:返回的promise对象包含了解析内容
- 返回数据库的查询结果
下图简要的说明了promise对象可能拥有的状态: