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

2014-04-13 13:13:16 +08:00
 xcc7624
如题,希望能全面的解释一下,或者给些相关的资料。
6759 次点击
所在节点    程序员
14 条回复
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
2014-04-13 14:02:04 +08:00
异步. 关于深入理解, 你可以看看它的实现. 很简单, 大概 200 行代码左右.
jsonline
2014-04-13 14:06:48 +08:00
$.ajax 就是 promise 的经典应用
xu33
2014-04-13 14:49:20 +08:00
优势在于连续的异步回调嵌套的场景,可以用一种近似于同步的语法来表现
jsonline
2014-04-13 14:53:37 +08:00
Promise 的存在不是为了让语法看起来像同步,而是为了让回调的使用更有章法,更可控
jasli2
2014-04-13 15:35:34 +08:00
andyhu
2014-04-13 18:00:23 +08:00
还是等待es6的generator吧
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
2014-04-13 21:22:18 +08:00
nodejs里解决回调嵌套的方法有好多,promise,async,eventproxy,等等。后2者只是在局部范围内解决问题,但是promise是从根本上入手,支持promise,你就可以随心所欲的.then().then().fail(),整个项目,整个框架都可以用promise组织实现,要不promise怎么会有规范呢?
我觉得nodejs应该原生就支持promise,现在这样有点可惜。
ryanking8215
2014-04-13 21:23:19 +08:00
跑题了,ORM框架sequelizejs api就用了promise实现
leecade
2014-04-13 22:45:55 +08:00
promise 只是提出一种包装规范, 在浏览器端过渡用的, 没有实质性的东西

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

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

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

目前已经有很火的应用: koa 框架, 构建在协程的思想上, 具体可看: https://github.com/visionmedia/co
hkongm
2014-04-14 08:42:23 +08:00
@jsonline ajax和promise没有关系好伐。只不过为了解决XHR的回调问题,引入promise。
jsonline
2014-04-14 08:46:30 +08:00
@hkongm 这不就是他们之间的关系么?利用Promise来方便回调
xcc7624
2014-04-14 20:13:53 +08:00
@emric在jquery中promise最终还是以回调来实现,对于不同的库,实现会有些差异,这里其实我是想,了解一些比较典型性的应用,并且和回调比起来确实是方便了不少的典型应用。按照@jasli2 给的链接,promise似乎是让你不用太多的执行顺序的问题,而是让你告诉程序应该达到什么样的目的,而淡化了让程序员安排怎么去做。
另外这几天看了一些,感觉@leecade 说的 解决 动画队列和前端资源加载优化好像是有这样的例子。不过还没看到相关解耦的例子,大侠@leecade 能否再给些实际例子。
多谢各位寄予我的帮助。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/108364

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX