侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Javascript Promise

Java  /  管理员 发布于 3年前   411

        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模式的6个特性
    下一条:
    java常见的ClassNotFoundException
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在php8.0+版本中使用属性来增加值代码示例(0个评论)
    • java 正则表达式基础,实例学习资料收集大全 原创(0个评论)
    • java正则表达式彻底研究(0个评论)
    • java正则表达式验证函数(0个评论)
    • MVC、MVP和MVVM分别是什么(0个评论)
    • 近期文章
    • 在Nuxt3中如何减少import model声明及初始化加载models快速开发秘诀(0个评论)
    • 适用于 Laravel 的表单请求测试程序包(0个评论)
    • Laravel 10.25版本发布(0个评论)
    • 在go语言中实现生成文件的校验和功能代码示例(0个评论)
    • Laravel 11版本抢先看,看将有什么新功能发布(0个评论)
    • goose数据库迁移工具介绍及使用流程步骤(0个评论)
    • 中国程序员“翻墙”为海外软件公司打工,105.8万工资被罚没!转知乎(0个评论)
    • 在go语言gin框架中使用Sharding(Gorm分表中间件)实现分表流程步骤(0个评论)
    • 在PHP提高性能方式之开启OPCache扩展及OPCache配置参数详解(0个评论)
    • 在js的websocket客户端开发中遇到代码割裂情况解决方案(0个评论)
    • 近期评论
    • 路人 在

      php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..
    • 博主 在

      科学上网翻墙之v2rayN-Core客户端免费公益节点使用教程中评论 @ mashrdn 多切换几个节点测试,免费ssr是没那么稳..
    • mashrdn 在

      科学上网翻墙之v2rayN-Core客户端免费公益节点使用教程中评论 V2rayn免费节点添加上去了,youtobe无法打开网页,是怎么回事..
    • 张伟 在

      科学上网翻墙之v2rayN-Core客户端免费公益节点使用教程中评论 3q!有用,不过免费节点隔天就要去git上复制新的导进去..
    • 博主 在

      科学上网翻墙访问Google , 上外网神器佛跳墙VPN(永久免费)使用流程步骤中评论 该篇教程已不能用了,告知大家,免的老有老铁问我!..
    • 2016-11
    • 2018-03
    • 2020-03
    • 2023-05
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客