ES(ECMAScript)之Promise

promises简介

Promise是处理异步代码的一种方法,无需在代码中编写太多回调。

promise已经存在多年,在ES2015中进行了标准化和引入,现在它们已经被ES2017中的异步函数所取代。

异步函数使用promise API作为基础,因此理解promise是必要的。

promises工作原理

一旦调用了promise,它将启动一个挂起状态。这时调用函数继续执行,同时等待promise执行自己的处理,并给调用函数提供一些反馈。

此时,调用函数会等待promise返回一个状态,但是JavaScript是异步的,所以promise在工作时候,函数会继续执行。

哪些javascript API使用promise?

除了您自己的代码和代码库之外,Promises还被标准的现代Web API使用,例如:

  • the Battery API
  • the Fetch API
  • Service Workers

在现代web应用开发中,你一定会用到promise,所以让我们深入了解它。

创建一个promise

Promise API公开了一个Promise构造函数,您可以使用 new Promise() 进行初始化:

正如您所看到的,promise会检查全局常量done,如果是true,将返回resolve,否则将返回reject。

使用resolve和reject我们可以返回一个值,在上面的例子中我们只返回一个字符串,但它也可以是一个对象。

使用promise

在上一节中,我们介绍了如何创建promise,现在让我们看看如何使用promise。

运行checkIfItsDone()将执行一个promise isItDoneYet() 并使用then回调等待返回,如果有错误,它将在catch回调中处理。

链式promise

promise可以返回另一个promise,创建一个链式promise。

链式promise一个很好的例子是由Fetch API提供的,这是XMLHttpRequest API之上的一个层,我们可以使用它来获取资源,并且在获取资源时,把链式promise放到队列去执行。

Fetch API是一种基于promise的机制,调用fetch()相当于使用new Promise()定义我们自己的promise。

链接promise的例子

在这个例子中,我们调用fetch()从todos.json文件中得到todos列表,我们创建了一个链式promise。

运行fetch()会返回一个response,这个response有许多属性:

  • status,表示HTTP状态代码的数值
  • statusText,状态消息,如果请求成功,则为OK

response还有一个json()方法,它返回一个promise,它将解析body内容并转换为JSON。

这个链式promise,执行流程是:链中的第一个promise是我们定义的一个函数,名为status(),它检查response状态,如果它不是成功response(在200和299之间),将返回reject。

reject操作将导致promise链直接跳到catch()语句,记录Request failed text以及错误消息。

如果成功,它会调用json()函数。当前面一个promise成功返回response对象时,我们将这个response作为第二个promise的输入参数。

在这种情况下,返回JSON格式的数据,因此第三个promise直接接收这个JSON数据:

我们将json数据打印到控制台。

处理错误

在上一节示例中,我们有一个附加到promise链的catch。

当promise链中产生错误或promise reject时,控制语句将转到链中最近的catch()语句。

级联错误

如果在catch()内部引发错误,则可以附加第二个catch()来处理它,依此类推。

编排promise

Promise.all()

如果你需要同步多个promise,Promise.all()可以帮助你定义一个promise列表,并在它们全部解析后执行。

例子:

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();