`
yiminghe
  • 浏览: 1461457 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

promise api 与应用场景

 
阅读更多

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/

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Java异步编程框架之Promise介绍

    Java异步编程框架Promise是用于处理异步操作的一个重要工具,尤其在Java中,Promise的概念被广泛应用于多种场景下进行高效的数据处理和结果获取。Promise框架主要作用在于简化异步编程模型,使其更加易于理解和使用...

    前端开源库-promise-queue

    例如,在批量上传文件或执行多个API调用时,我们可以先将这些操作封装为返回Promise的函数,然后将它们添加到Promise Queue中。这样,队列会按照添加的顺序依次执行任务,并且最多只有设定数量的任务在任何时候并行...

    Fetch+Promise教程

    Fetch API 提供了对 Request 和 Response 对象的通用定义,可以被使用到很多场景中,例如 service workers、Cache API、其他处理请求和响应的方式,甚至任何需要生成自己的响应的方式。Fetch 是一个很先进的概念,...

    微信小程序 es6 promise

    在微信小程序中,Promise的使用通常涉及到网络请求、数据加载、定时任务等场景。例如,我们可以使用wx.request()函数来发起HTTP请求,这个函数返回的就是一个Promise对象。下面是一个简单的例子: ```javascript wx...

    vue promise then多级嵌套

    在Vue.js开发中,Promise和then的多级嵌套是一个常见的场景,特别是在处理异步操作时。Promise是ES6引入的一种解决回调地狱问题的新机制,它使得异步代码可以更有序、可读性更强。Vue.js作为一个前端框架,深度集成...

    javascript-promise-book.pdf

    学习Promise不仅需要理解其基本概念,还需要掌握如何将它们应用到实际的Web开发中,包括但不限于处理异步的HTTP请求、数据操作、文件I/O等场景。通过学习Promise,可以编写出更加简洁、可维护和可预测的异步代码,...

    前端开源库-stream-promise

    通过学习和使用`stream-promise`,前端开发者可以更有效地处理大数据量的场景,如实时数据流、大文件上传和下载等,同时保持代码的简洁性和可维护性。结合Promise的特性,它还能够帮助开发者更好地管理异步流程,...

    javascript-promise-book

    此外,书中还提到了一些高级用法,比如如何使用 `Promise.race` 来取消请求等,这些都是在日常开发中可能会遇到的实际应用场景。总的来说,《JavaScript Promise 迷你书》是一本非常适合初学者入门 Promise 的好书,...

    ArcGIS API for JavaScript v4.16 API & SDK 库文件与官方文档

    示例代码是学习API的好途径,因为它们展示了实际应用场景中的API使用方式。通过查看和运行这些示例,开发者可以快速掌握API的使用技巧,从而更高效地开发Web GIS应用。 在开发过程中,注意API的版本兼容性,因为...

    使用Javascript API创建Web 3D应用_刘利平.pdf

    2. **3D场景与图层加载**: - **3D场景创建**:通过API可以创建并管理3D地图场景,包括加载地形、建筑物等3D要素。 - **图层加载**:支持加载不同类型的3D图层,如3D影像、3D矢量数据等。 3. **3D符号化与光照...

    arcgis-js-v429-sdk api

    总结,ArcGIS JS V4.29 SDK API是开发Web GIS应用的强大工具,它提供了全面的地理空间功能和灵活的扩展性,使开发者能够构建出功能丰富的地图应用,无论是2D还是3D场景,都能游刃有余地进行开发。通过深入理解和熟练...

    全异步SwooleAPI开发框架内置Promise异步MySQL连接池内存缓存管理异步Task方案等

    全异步Swoole API开发框架是现代PHP开发中一种高效、高性能的选择,它结合了Promise、异步MySQL连接池、内存缓存管理和异步Task处理等关键特性,旨在为Web应用提供强大的并发处理能力。以下是对这些核心知识点的详细...

    redux-promise-middleware例子

    在本文中,我们将深入探讨如何使用`redux-promise-middleware`在React应用中实现异步操作,特别是针对登录验证功能。`redux-promise-middleware`是Redux生态系统中的一个中间件,它允许我们处理Promise,使得在Redux...

    arcgis api for javascript v4.18 v3.35

    本篇文章将深入探讨V4.18和V3.35这两个版本的API,揭示它们在功能、性能以及使用场景上的差异,帮助开发者更好地理解和应用这两个版本。 首先,让我们聚焦V4.18。这个版本的API引入了许多新特性,包括增强的性能、...

    基于Promise,支持请求转发的跨平台javascript http请求库.zip

    《基于Promise的跨平台JavaScript HTTP请求库:深入解析与应用》 在当今的Web开发领域,JavaScript已经成为不可或缺的一部分,尤其在处理HTTP请求方面。随着Promise的引入,异步编程变得更加简洁和易于理解。本篇...

    如何在 JavaScript 中使用 Promise.allSettled().docx

    例如,在API调用的场景中,如果你不希望一个API请求的失败阻止其他请求的结果被处理,那么这个方法是一个理想的解决方案。 使用Promise.allSettled()的语法如下: ```javascript Promise.allSettled(promisesArray...

    开源 Fetion api java

    这个API可能是开发者为了方便其他应用程序与飞信平台集成而创建的。 在描述中提到的“NULL 博文链接:https://azure1489.iteye.com/blog/437494”,表明有一个相关的博客文章,虽然描述本身没有提供具体信息,但...

    微信小程序异步API同步化研究.pdf

    微信小程序作为目前流行的移动应用开发方式,其异步API的使用是小程序开发中的一个重要部分。异步API是指不直接返回结果,而是通过回调函数、事件、Promise等机制来处理异步操作结果的一种编程接口。然而,异步API在...

    javascript API

    在本文中,我们将深入探讨JavaScript API的核心概念、常见使用场景以及关键知识点。 1. **核心概念** - **API(Application Programming Interface)**:API是一组预定义的函数、类、对象和常量,开发者可以调用...

    Javascript API

    10. **WebGL API**:用于在浏览器中进行3D图形渲染,通过`WebGLRenderingContext`对象与GPU交互,创建复杂的3D场景。 以上只是JavaScript API中的一部分,实际上,随着Web技术的发展,API的范围不断扩大,涵盖了...

Global site tag (gtag.js) - Google Analytics