- 浏览: 1466272 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
luhouxiang:
写的很不错,学习了
Extjs 模块化动态加载js实践 -
kingkongtown:
如果想改成淘宝后台那样,可以在编辑器批量上传图片呢?
kissy editor 阶段体会 -
317966578:
兄弟我最近也在整jquery和caja 开放一些接口。在git ...
caja 原理 : 前端 -
liuweihug:
Javascript引擎单线程机制及setTimeout执行原 ...
setTimeout ,xhr,event 线程问题 -
辽主临轩:
怎么能让浏览器不进入 文档模式的quirks模式,进入标准的
浏览器模式与文本模式
promise 是 commonjs 社区中提出的异步规范,其简洁直观的 api 使得异步读值操作更易于理解和使用,主要 api 包括:
API
Defer
功能实现者调用 Defer() 后产生 Defer 对象,它包括 promise 属性以及 resolve 和 reject 方法
promise 对象
功能调用者通过调用 promise 的 then 方法添加成功回调和失败回调函数。多次调用 then 添加的回调函数最终“并行”执行,互相独立。
resolve/reject
功能实现者通过 resolve/reject 来通知 promise 对象成功与否并传递指定的参数给调用者的回调函数来执行。
note:
通过分离 Defer 对象和 promise 对象,可以达到功能实现者和调用者的权限分离,符合 Object-capability-model 从而更有利于系统的安全。
all
通过 all 方法生成一个新的 promise 对象,通过该对象可以监控一批 promise 对象,只有当全部 promise 都成功时才使得新的 promise 对象成功,否则只要有一个 promise 对象失败那么新生成的 promise 就算做失败。
when
调用 when 可以统一获取 promise 对象和非 promise 对应的值,屏蔽异步的差异。
api 使用
then
1. 统一的回调注册
then 方法提供了一个统一的回调注册接口,无论注册时该异步 promise 是否已经成功,都会保证回调函数会被及时调用。
例如:
可以成功前注册:
var defer= S.Defer(); defer.promise.then(function(v){ alert(v===1); }); setTimeout(function(){ defer.resolve(1); },5000);
也可以在成功后注册(仍然会被调用)
var defer= S.Defer(); defer.resolve(1); setTimeout(function(){ defer.promise.then(function(v){ alert(v===1); }); },5000);
2. 链式操作
then 会返回一个新的 promise 对象,那么在这个返回对象上可以继续调用 then 方法,而参数值则是上一个 then 方法的返回值:
var defer = S.Defer(); defer.promise.then(function(v){ alert(v===1); return v+1; }).then(function(v2){ alert(v2===2); }); defer.resolve(1);
3. 嵌套链式操作
更进一步:回调函数也可以返回一个 promise 对象,那么 then 返回的 promise 对象则会等待回调函数返回的 promise 对象成功后才算成功,并且最后一个 then 的回调函数的参数为 导致前一个 then 回调函数返回的 promise 对象成功 的值:
var defer = S.Defer(); defer.promise.then(function(v){ alert(v===1); var d2= S.Defer(); setTimeout(function(){ d2.resolve(2); },1000); return d2.promise; }).then(function(v2){ alert(v2===2); }); defer.resolve(1);
all
使用 all 也可以达到嵌套调用的效果(同时等待多个 promise 成功),并可一次性得到导致所有 promise 成功的值:
var defer = S.Defer(); var defer2 = S.Defer(); setTimeout(function(){ defer2.resolve(2); defer.resolve(1); },1000); S.Promise.all([defer.promise,defer2.promise]).then(function(vs){ alert(vs[0]===1); alert(vs[1]===2); });
when
使用 when 可以不加区别得对待 promise 对象和非 promise 对象,通过成功回调可以一致得获取最终结果:
function check(p){ S.Promise.when(p,function(v){ alert(v===1); }); } var defer=S.Defer(); defer.resolve(1); check(1); // => alert(true) check(defer.promise); //=> alert(true);
使用场景
domReady
domReady 是个异步过程,具备以下特征使得它非常适合使用 promise 来实现:
1. domReady 添加回调时可能该事件已经触发过。
2. 多个 domReady 添加的回调并不需要前后依赖,并且要求其中一个回调失败并不影响其他回调(即回调间独立)
那么内部实现即可将 S.ready(fn) 的调用转交给内部的 readyDefer.promise.then。那么当浏览器 domready 时只需简单调用 readyDefer.resolve(S) 即可.
io/ajax
io/ajax 一般也是异步 io,通过 promise 实现 io,那么就可以摆脱必须将处理逻辑统统写在一处的限制:
var r=S.io({...}); r.then(function(v){ // logic 1 }); r.then(function(v){ // logic 2 });
并且通过嵌套以及 all 也可以很容易支持多个系统间的相互时序依赖。
串行:
var r=S.io({..}); r.then(function(v){ return S.io({..,data:{v2:v+1}}) }).then(function(v2){ // logic v2 })
并行:
S.Promise.all([S.io({url:'u1'}),S.io({url:'u2'})]).then(function(vs){ alert("u1+u2 => " + (vs[0]+vs[1])); });
Module Loader
同 io 类似通过用嵌套以及 all 来管理多个 module 代码文件的串行以及并行加载,可以更加清晰得组织代码结构。
Refer:
KISSY.Defer API & KISSY.Promise API
http://wiki.commonjs.org/wiki/Promises
http://en.wikipedia.org/wiki/Futures_and_promises#Read-only_views
http://en.wikipedia.org/wiki/Object-capability_model
https://github.com/kriskowal/q
http://www.sitepen.com/blog/2010/05/03/robust-promises-with-dojo-deferred-1-5/
http://dojotoolkit.org/documentation/tutorials/1.6/deferreds/
http://api.jquery.com/category/deferred-object/
发表评论
-
continuation, cps
2013-09-12 16:49 2813起 随着 nodejs 的兴起,异步编程成为一种潮流 ... -
一种基于匹配回朔的 css3 选择器引擎实现
2013-05-07 20:40 3416一种基于匹配回朔的 css3 选择器引擎实现 介绍 C ... -
模块化高扩展性的前端框架 KISSY
2013-03-14 14:58 8636模块化高扩展性的前端框架 KISSY 注:本文为 2 ... -
cubic-bezier 模拟实现
2013-01-05 16:34 14111cubic-bezier 曲线是 css3 动画的一个重要基石 ... -
构建前端 DSL
2012-10-11 22:10 5375目前在传统的软件开 ... -
KISSY kisses bootstrap navbar
2012-08-03 01:12 6060看了下 bootstrap 的导航菜单,立刻非常喜欢,注意是浅 ... -
Get cursor position and coordinates from textarea
2012-04-10 20:50 5074最近需要从 textarea 中获 ... -
兼容 ie 的 transform
2012-02-23 14:00 6445css 2d transform 是 css3 引入的一个新的 ... -
closure compiler 代码优化实例
2012-01-08 03:23 2845closure compiler 可以进行不少有意思的优化 ... -
write html parser
2011-12-01 02:48 2927首先需要声明 html 不能用正则表达式来直接匹配进行内容抽取 ... -
获取剪贴板数据
2011-11-07 23:31 6461兼容性: 获取剪贴板数据这块各个浏览器间存在很大的 ... -
url 映射问题
2011-11-07 21:52 3232背景 url mapping 我最早知道是作为 j ... -
tip:如何原生播放声音
2011-10-19 12:45 2987如果不想考虑浏览器间 ... -
unified event model
2011-10-14 23:02 1791为了处理原生事件在各 ... -
转载:瀑布流布局浅析
2011-09-29 19:02 2856简介 如果你经 ... -
cross domain request
2011-09-29 18:39 2854场景 跨域请求是随着 ... -
基于多继承的树设计
2011-09-18 03:42 2274分类 树是一种常见 ... -
caja 原理 : 前端
2011-09-01 16:48 7080作为前端开放的基础安全保证,caja 是目前比较合 ... -
tokenization of html
2011-08-29 22:38 2796html 符号解析问题 场景: 在页面上输出包 ... -
ie 下 cloneNode 导致的属性克隆
2011-08-24 16:10 2484这个还是很值得记下,一直存在的很大隐患终于解决,由于在 ie& ...
相关推荐
Java异步编程框架Promise是用于处理异步操作的一个重要工具,尤其在Java中,Promise的概念被广泛应用于多种场景下进行高效的数据处理和结果获取。Promise框架主要作用在于简化异步编程模型,使其更加易于理解和使用...
例如,在批量上传文件或执行多个API调用时,我们可以先将这些操作封装为返回Promise的函数,然后将它们添加到Promise Queue中。这样,队列会按照添加的顺序依次执行任务,并且最多只有设定数量的任务在任何时候并行...
Fetch API 提供了对 Request 和 Response 对象的通用定义,可以被使用到很多场景中,例如 service workers、Cache API、其他处理请求和响应的方式,甚至任何需要生成自己的响应的方式。Fetch 是一个很先进的概念,...
在微信小程序中,Promise的使用通常涉及到网络请求、数据加载、定时任务等场景。例如,我们可以使用wx.request()函数来发起HTTP请求,这个函数返回的就是一个Promise对象。下面是一个简单的例子: ```javascript wx...
在Vue.js开发中,Promise和then的多级嵌套是一个常见的场景,特别是在处理异步操作时。Promise是ES6引入的一种解决回调地狱问题的新机制,它使得异步代码可以更有序、可读性更强。Vue.js作为一个前端框架,深度集成...
学习Promise不仅需要理解其基本概念,还需要掌握如何将它们应用到实际的Web开发中,包括但不限于处理异步的HTTP请求、数据操作、文件I/O等场景。通过学习Promise,可以编写出更加简洁、可维护和可预测的异步代码,...
通过学习和使用`stream-promise`,前端开发者可以更有效地处理大数据量的场景,如实时数据流、大文件上传和下载等,同时保持代码的简洁性和可维护性。结合Promise的特性,它还能够帮助开发者更好地管理异步流程,...
此外,书中还提到了一些高级用法,比如如何使用 `Promise.race` 来取消请求等,这些都是在日常开发中可能会遇到的实际应用场景。总的来说,《JavaScript Promise 迷你书》是一本非常适合初学者入门 Promise 的好书,...
示例代码是学习API的好途径,因为它们展示了实际应用场景中的API使用方式。通过查看和运行这些示例,开发者可以快速掌握API的使用技巧,从而更高效地开发Web GIS应用。 在开发过程中,注意API的版本兼容性,因为...
2. **3D场景与图层加载**: - **3D场景创建**:通过API可以创建并管理3D地图场景,包括加载地形、建筑物等3D要素。 - **图层加载**:支持加载不同类型的3D图层,如3D影像、3D矢量数据等。 3. **3D符号化与光照...
总结,ArcGIS JS V4.29 SDK API是开发Web GIS应用的强大工具,它提供了全面的地理空间功能和灵活的扩展性,使开发者能够构建出功能丰富的地图应用,无论是2D还是3D场景,都能游刃有余地进行开发。通过深入理解和熟练...
全异步Swoole API开发框架是现代PHP开发中一种高效、高性能的选择,它结合了Promise、异步MySQL连接池、内存缓存管理和异步Task处理等关键特性,旨在为Web应用提供强大的并发处理能力。以下是对这些核心知识点的详细...
在本文中,我们将深入探讨如何使用`redux-promise-middleware`在React应用中实现异步操作,特别是针对登录验证功能。`redux-promise-middleware`是Redux生态系统中的一个中间件,它允许我们处理Promise,使得在Redux...
本篇文章将深入探讨V4.18和V3.35这两个版本的API,揭示它们在功能、性能以及使用场景上的差异,帮助开发者更好地理解和应用这两个版本。 首先,让我们聚焦V4.18。这个版本的API引入了许多新特性,包括增强的性能、...
《基于Promise的跨平台JavaScript HTTP请求库:深入解析与应用》 在当今的Web开发领域,JavaScript已经成为不可或缺的一部分,尤其在处理HTTP请求方面。随着Promise的引入,异步编程变得更加简洁和易于理解。本篇...
例如,在API调用的场景中,如果你不希望一个API请求的失败阻止其他请求的结果被处理,那么这个方法是一个理想的解决方案。 使用Promise.allSettled()的语法如下: ```javascript Promise.allSettled(promisesArray...
这个API可能是开发者为了方便其他应用程序与飞信平台集成而创建的。 在描述中提到的“NULL 博文链接:https://azure1489.iteye.com/blog/437494”,表明有一个相关的博客文章,虽然描述本身没有提供具体信息,但...
微信小程序作为目前流行的移动应用开发方式,其异步API的使用是小程序开发中的一个重要部分。异步API是指不直接返回结果,而是通过回调函数、事件、Promise等机制来处理异步操作结果的一种编程接口。然而,异步API在...
在本文中,我们将深入探讨JavaScript API的核心概念、常见使用场景以及关键知识点。 1. **核心概念** - **API(Application Programming Interface)**:API是一组预定义的函数、类、对象和常量,开发者可以调用...
10. **WebGL API**:用于在浏览器中进行3D图形渲染,通过`WebGLRenderingContext`对象与GPU交互,创建复杂的3D场景。 以上只是JavaScript API中的一部分,实际上,随着Web技术的发展,API的范围不断扩大,涵盖了...