Parse JavaScript SDK现在提供了支持大多数异步方法的兼容jquery的Promises模式,那么这意味着什么呢,读完下文你就了解了。
一.认识Promises
“Promises”代表着在javascript程序里下一个伟大的范式,但是理解他们为什么如此伟大不是件简单的事。它的核心就是一个promise代表一个任务结果,这个任务有可能完成有可能没完成。Promise模式唯一需要的一个接口是调用then方法,它可以用来注册当promise完成或者失败时调用的回调函数,这在CommonJS Promises/A proposal.大体讲到了。比如,我想保存一个Prase.Object对象,这是个异步操作,在旧的回调范式中,你的代码可能这样写:
object.save({ key: value }, { success:function(object) { // the object was saved. }, error:function(object, error) { // saving the object failed. } });
在新的Promise范式中,同样的代码你可以这样写:
object.save({ key: value }).then( function(object) { // the object was saved. }, function(error) { // saving the object failed. });
没有多大的区别?那么有啥大不了的地方呢?好吧,promises的真正强大之处在于多重链接,当调用promise.then(func)时返回一个新的promise,它不会执行直到上一个完成。但是这里有一种特殊的情况,如果我的回调通过then返回一个新的promise,那么通过then返回的promise将不会执行,直到回调执行完成。详细细节请参考Promises/A+,这是个复杂的规则,通过例子我们能更清楚的认识下。
假设你写了段登陆的代码,查找对象然后更新它。在旧的回调范式中,你可以使用金字塔式的代码完成:
Parse.User.logIn("user","pass", { success:function(user) { query.find({ success:function(results) { results[0].save({ key: value }, { success:function(result) { // the object was saved. } }); } }); } });
这看起来已经很可笑,更可笑的是甚至没有任何错误处理。但是promise链式的结构,使代码看起来更舒服了:
Parse.User.logIn("user","pass").then(function(user) { returnquery.find(); }).then(function(results) { returnresults[0].save({ key: value }); }).then(function(result) { // the object was saved. });
二.错误处理
上面的代码简单期间没有添加错误处理,但是添加了后你会发现在旧的回调代码中一团糟:
Parse.User.logIn("user","pass", { success:function(user) { query.find({ success:function(results) { results[0].save({ key: value }, { success:function(result) { // the object was saved. }, error:function(result, error) { // An error occurred. } }); }, error:function(error) { // An error occurred. } }); }, error:function(user, error) { // An error occurred. } });
由于promises知道处理是否完成,它可以传递错误,不执行任何回调直到遇到错误。比如,上面的代码可以简写为:
Parse.User.logIn("user","pass").then(function(user) { returnquery.find(); }).then(function(results) { returnresults[0].save({ key: value }); }).then(function(result) { // the object was saved. },function(error) { // there was some error. });
通常,开发者认为一个异步的promise失败等同于抛出一个异常。事实上,如果一个回调抛出一个错误,promise将返回失败信息。把错误传递到下一个可用的错误处理器等同于抛出一次异常直到捕获处理。
三.jQuery、Backbone和Parse
有很多实现了promises的库供开发者可用。 像jQuery的Deferred, 微软的 WinJS.Promise, when.js, q, 和dojo.Deferred。
然而,有个有趣的地方需要了解。你可以在这里读到long and fascinating jQuery pull request discussion, jQuery的实现没有完全按照Promises/A的规则来,很多地方用了其他实现方式,实验时,我发现只有一个地方不太一样。如果一个错误处理器返回一些其他的信息,而不单纯返回一个promise,大多数实现会考虑处理这个错误,不做错误传递。然而,jquery不认为在此处处理这个错误,而是把它向前传递。虽然,来自不同系统的promise应该能无缝的混合使用,但是你还是应当注意些。一个潜在的问题是会在错误处理器中返回promises(替换原始数值),因为它们会被同等对待。
doFailingAsync().then(function() { // doFailingAsync doesn't succeed. },function(error) { // Try to handle the error. return"It's all good."; }).then(function(result) { // Non-jQuery implementations will reach this with result === "It's all good.". },function(error) { // jQuery will reach this with error === "It's all good.". });
在Backbone 0.9.10版本中,异步方法现在返回一个jqXHR,这是jquery promise的一种类型。Parse JavaScript SDK的一个目标是尽可能的和Backbone兼容,我们不能返回一个jqXHR,因为它在Cloud Code上不能很好地工作,因此,我们不都添加一个Parse.Promise类,它遵照jQuery Deferred的标准。 Parse JavaScript SDK最新版本已经更新了所有的异步方法来支持这些新的对象,旧的回调方法仍然可用。但是基于上面列出的例子,我相信你更喜欢新的方式。所以试试promises吧!
文章来源:http://www.oschina.net/translate/whats-so-great-about-javascript-promises?cmp
相关推荐
JavaScript Promise 是一种在异步编程中管理回调函数的机制,它是ES6标准引入的重要特性,极大地改善了JavaScript处理异步操作的方式。Promise 迷你书(中文版)深入浅出地介绍了这一概念,旨在帮助开发者更好地理解...
ECMAScript Javascript Promise 详解
JavaScript Promise 是一种处理异步操作的方法,旨在解决传统的基于回调函数的异步编程模式所带来的问题,如回调地狱(Callback Hell)或回调金字塔。Promise 的概念起源于 CommonJS 规范,后来被纳入 ES6,成为了...
### JavaScript Promise 学习与应用详解 #### 一、引言 在JavaScript中,Promise是一种用于处理异步操作的方法,它有效地解决了回调地狱的问题。本文将深入探讨Promise的基础概念、实现原理以及具体应用场景。 ###...
### JavaScript Promise 学习使用方法小结 #### 一、Promise 概述 在JavaScript中,Promise 是一种用于处理异步操作的模式。它提供了一种更优雅的方式来处理异步流程,避免了传统的回调地狱(Callback Hell)问题...
javascript promise book, cook book, promise
JavaScript promise对象
本书《JavaScript(ES6)Promise迷你书》是一本专注于ES6中Promise对象的迷你教程,它旨在向读者介绍Promise的概念、使用方法、原理,并指导读者如何自己动手实现一个Promise库。Promise是JavaScript中用于异步编程...
JavaScript Promise 是一种处理异步操作的技术,它在ES6中被引入,旨在解决回调地狱问题,提供了一种更强大、规范化的异步编程解决方案。Promise 是一个代表了可能还未完成或已经完成的异步操作的对象,它有三种状态...
### JavaScript Promise 迷你书知识点总结 #### 一、什么是Promise? **Promise** 是JavaScript中一种处理异步操作的新方式,它可以替代传统的回调函数(callback)来管理异步任务,使得代码更加清晰、易于理解和...
在JavaScript编程中,Promise是处理异步操作的重要工具,它为复杂的回调地狱提供了一种更加优雅的解决方案。Promise对象代表了可能还没有完成的异步操作的结果,它可以处于三种状态:pending(等待中)、fulfilled...
JavaScript Promise启示录这篇文章深入探讨了JavaScript中Promise的概念、优势以及使用方法,同时也触及了Promise/A+规范和实现原理。下面我们来详细解析这些知识点。 1. Promise的提出背景及意义 Promise是随着...
JavaScript Promise机制是前端开发中处理异步操作的一个重要特性。Node.js作为JavaScript的一个运行环境,其本身也支持Promise机制。本文将详细介绍如何在Node.js中通过代码示例简单实现Promise/A+规范。 首先,...
JavaScript Promise 是一种异步编程的解决方案,用于处理复杂的异步操作。Promise 在JavaScript生态系统中扮演着重要的角色,尤其是在ES6及以后的版本中。它帮助开发者管理回调地狱,使代码结构更加清晰,易于理解和...
JavaScript中的Promise是异步编程的关键工具,用于管理复杂的异步操作。Promise的出现解决了传统的回调地狱问题,使得异步代码更加清晰、可读性更强。下面将详细解释Promise的使用和核心概念。 **1. 创建Promise...
JavaScript Promise 是一种在ES6中引入的异步编程解决方案,旨在解决回调地狱(Callback Hell)问题,让异步代码更加可读、可维护。Promise 代表一个未来可能完成或失败的异步操作的结果,它可以处于三种状态:...
Promise对象在JavaScript中的引入,是为了更好地处理异步编程,解决回调地狱问题,提供了一种更结构化、更易于理解和维护的方式来处理异步操作。Promise代表一个未来可能完成或失败的任务,它有三种状态:pending...