Promise是处理异步代码的一种方法,无需在代码中编写太多回调。
promise已经存在多年,在ES2015中进行了标准化和引入,现在它们已经被ES2017中的异步函数所取代。
异步函数使用promise API作为基础,因此理解promise是必要的。
一旦调用了promise,它将启动一个挂起状态。这时调用函数继续执行,同时等待promise执行自己的处理,并给调用函数提供一些反馈。
此时,调用函数会等待promise返回一个状态,但是JavaScript是异步的,所以promise在工作时候,函数会继续执行。
除了您自己的代码和代码库之外,Promises还被标准的现代Web API使用,例如:
在现代web应用开发中,你一定会用到promise,所以让我们深入了解它。
Promise API公开了一个Promise构造函数,您可以使用 new Promise() 进行初始化:
正如您所看到的,promise会检查全局常量done,如果是true,将返回resolve,否则将返回reject。
使用resolve和reject我们可以返回一个值,在上面的例子中我们只返回一个字符串,但它也可以是一个对象。
在上一节中,我们介绍了如何创建promise,现在让我们看看如何使用promise。
运行checkIfItsDone()将执行一个promise isItDoneYet() 并使用then回调等待返回,如果有错误,它将在catch回调中处理。
promise可以返回另一个promise,创建一个链式promise。
链式promise一个很好的例子是由Fetch API提供的,这是XMLHttpRequest API之上的一个层,我们可以使用它来获取资源,并且在获取资源时,把链式promise放到队列去执行。
Fetch API是一种基于promise的机制,调用fetch()相当于使用new Promise()定义我们自己的promise。
在这个例子中,我们调用fetch()从todos.json文件中得到todos列表,我们创建了一个链式promise。
运行fetch()会返回一个response,这个response有许多属性:
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.all()
如果你需要同步多个promise,Promise.all()可以帮助你定义一个promise列表,并在它们全部解析后执行。
例子:
留言与评论(共有 0 条评论) |