V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xcc7624
V2EX  ›  程序员

javascript 的 promise 模式,有什么典型的应用?

  •  
  •   xcc7624 · 2014-04-13 13:13:16 +08:00 · 6738 次点击
    这是一个创建于 3637 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如题,希望能全面的解释一下,或者给些相关的资料。
    14 条回复    1970-01-01 08:00:00 +08:00
    c060604
        1
    c060604  
       2014-04-13 13:58:37 +08:00
    https://github.com/kriskowal/q
    q是对promise规范的实现。

    http://docs.angularjs.org/api/ng/service/$q
    前段框架ng继承了q
    emric
        2
    emric  
       2014-04-13 14:02:04 +08:00 via iPhone
    异步. 关于深入理解, 你可以看看它的实现. 很简单, 大概 200 行代码左右.
    jsonline
        3
    jsonline  
       2014-04-13 14:06:48 +08:00
    $.ajax 就是 promise 的经典应用
    xu33
        4
    xu33  
       2014-04-13 14:49:20 +08:00
    优势在于连续的异步回调嵌套的场景,可以用一种近似于同步的语法来表现
    jsonline
        5
    jsonline  
       2014-04-13 14:53:37 +08:00 via Android
    Promise 的存在不是为了让语法看起来像同步,而是为了让回调的使用更有章法,更可控
    jasli2
        6
    jasli2  
       2014-04-13 15:35:34 +08:00
    andyhu
        7
    andyhu  
       2014-04-13 18:00:23 +08:00
    还是等待es6的generator吧
    jakwings
        8
    jakwings  
       2014-04-13 18:48:02 +08:00
    阮一峰的笔记介绍得不错: http://javascript.ruanyifeng.com/advanced/asynchronous.html#toc4
    另外附加一下文章中的一个要点:NodeJS 的 setImmediate(fn) 和 setTimeout(fn,0) 不同,可以使得必须在完成了目前线程的指令流之后才异步执行 fn ,另外 setImmediate 和 setTimeout 所占的事件队列是分离的。
    所以文章中的示例代码才能实现 (new Promise(fn1)).then(fn2) 而不怕 fn1 在绑定 fn2 之前就运行完毕。
    ryanking8215
        9
    ryanking8215  
       2014-04-13 21:22:18 +08:00
    nodejs里解决回调嵌套的方法有好多,promise,async,eventproxy,等等。后2者只是在局部范围内解决问题,但是promise是从根本上入手,支持promise,你就可以随心所欲的.then().then().fail(),整个项目,整个框架都可以用promise组织实现,要不promise怎么会有规范呢?
    我觉得nodejs应该原生就支持promise,现在这样有点可惜。
    ryanking8215
        10
    ryanking8215  
       2014-04-13 21:23:19 +08:00
    跑题了,ORM框架sequelizejs api就用了promise实现
    leecade
        11
    leecade  
       2014-04-13 22:45:55 +08:00
    promise 只是提出一种包装规范, 在浏览器端过渡用的, 没有实质性的东西

    主要是需要流程解耦的场景, 比如动画队列和前端资源加载优化

    有人说 nodejs 要原生支持 promise, 我觉得如果真这样做的话, 眼光太短浅了, node 等的还是下一代的异步编程: 协程

    ES6 的 generator 已经内置了类似的包装规范, 并且从底层运行机制进行了支持, 带来一些新的特性比如执行中断

    目前已经有很火的应用: koa 框架, 构建在协程的思想上, 具体可看: https://github.com/visionmedia/co
    hkongm
        12
    hkongm  
       2014-04-14 08:42:23 +08:00
    @jsonline ajax和promise没有关系好伐。只不过为了解决XHR的回调问题,引入promise。
    jsonline
        13
    jsonline  
       2014-04-14 08:46:30 +08:00 via Android
    @hkongm 这不就是他们之间的关系么?利用Promise来方便回调
    xcc7624
        14
    xcc7624  
    OP
       2014-04-14 20:13:53 +08:00
    @emric在jquery中promise最终还是以回调来实现,对于不同的库,实现会有些差异,这里其实我是想,了解一些比较典型性的应用,并且和回调比起来确实是方便了不少的典型应用。按照@jasli2 给的链接,promise似乎是让你不用太多的执行顺序的问题,而是让你告诉程序应该达到什么样的目的,而淡化了让程序员安排怎么去做。
    另外这几天看了一些,感觉@leecade 说的 解决 动画队列和前端资源加载优化好像是有这样的例子。不过还没看到相关解耦的例子,大侠@leecade 能否再给些实际例子。
    多谢各位寄予我的帮助。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2689 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:47 · PVG 23:47 · LAX 08:47 · JFK 11:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.