首页 > 语言 > JavaScript > 正文

如何利用Promises编写更优雅的JavaScript代码

2024-05-06 14:58:11
字体:
来源:转载
供稿:网友

你可能已经无意中听说过 Promises,很多人都在讨论它,使用它,但你不知道为什么它们如此特别。难道你不能使用回调么?有什么了特别的?在本文中,我们一起来看看 Promises 是什么以及如何使用它们写出更优雅的 JavaScript 代码。

Promises 易于阅读

比如说我们想从 HipsterJesus 的API中抓取一些数据并将这些数据添加到我们的页面中。这些 API 的响应数据形式如下:

{  "text": "<p>Lorem ipsum...</p>",  "params": {  "paras": 4,  "type": "hipster-latin" }} 

要使用回调的话,我们通常要写如下形式的东西:

$.getJSON('http://hipsterjesus.com/api/', function(data) {  $('body').append(data.text); }); 

如果你有 jQuery 的使用经历,你会认出我们创建了一个 GET 请求并且希望响应内容是 JSON。我们还传递了一个回调函数来接受响应的 JSON,以将数据添加到文档中。

另外一种书写方法是使用 getJSON 方法返回的 promise 对象。你可以直接在这个返回对象上绑定一个回调。

var promise = $.getJSON('http://hipsterjesus.com/api/');promise.done(function(data) {  $('body').append(data.text); }); 

在上面的回调例子中,当响应成功时它将 API 请求的结果添加到文档中。但当响应失败是会发生什么呢?我们可以在我们的 promise 上绑定一个失败处理器。

var promise = $.getJSON('http://hipsterjesus.com/api/');promise.done(function(data) {  $('body').append(data.text);});promise.fail(function() {  $('body').append('<p>Oh no, something went wrong!</p>'); }); 

大多数人删掉了 promise 变量,这样更简洁,一眼就能看出代码的作用。

$.getJSON('http://hipsterjesus.com/api/').done(function(data) {  $('body').append(data.text);}).fail(function() {  $('body').append('<p>Oh no, something went wrong!</p>'); }); 

jQuery 也包含一个一直发生的事件处理器,不论请求成功失败都会被调用。

$.getJSON('http://hipsterjesus.com/api/').done(function(data) {  $('body').append(data.text);}).fail(function() {  $('body').append('<p>Oh no, something went wrong!</p>');}).always(function() {  $('body').append('<p>I promise this will always be added!.</p>'); }); 

通过使用promise,回调的顺序是按预期的。我们能确保正常回调先被调用,然后是失败回调,最后是一直发生的回调。

更好的 API

比如说我们想创造一个 HipsterJesus API 的封装对象。我们会添加一个方法——html,它将来自 API 的 HTML 数据返回。与之前设置一个回调处理器来解析请求不同,我们可以让方法返回一个 promise 对象。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选