javascript 中 Promise的使用
有点经验的js前端都知道 ajax异步函数里面的结果不会立即返回,如果你想在一个异步函数得到某个结果后去执行一个语句怎么做?
if ( 异步函数 ) { 语句 } 可能很多人都踩过这样坑,这个时候新手一般都找不到问题,左看右看上看下看都是绝对完美的,找不到任何错误;
懂得人就会 把 这句话 放到异步里面去;这样做就没有问题了;但是如果异步里面判断结果后又要做一个异步,里面继续嵌套几个异步......这种情况是常见的;
所以其实 promise 就是以一种优雅的方式来解决这个问题;
提前说明一下,接下来的第一个代码片段是我们自己实现的简易版 Promise ,然后第二个代码片段使用了一下我们自己实现的简易版 Promise ;
让读者更清晰的理解 Promise 的设计原理,第三个代码片段就是使用js 自带的 Promise 做个演示;
 var Promise = function() {
     this.callbacks = [];
 }
 Promise.prototype = {
     resolve: function(result) {
         this.complete("resolve", result);
     },
     reject: function(result) {
         this.complete("reject", result);
     },
     complete: function(type, result) {
             while (this.callbacks[0]) {
             this.callbacks.shift()[type](result);
         }
     },
     then: function(successHandler, failedHandler) {
         this.callbacks.push({
             resolve: successHandler,
             reject: failedHandler
         });
         return this;
     }
 }
一个简单的Promise架子就准备好了,下面的来体验一把;
 // 实例化一个 Promise 对象
 var promise = new Promise();
 // 这个函数是一个异步(结果不是马上返回的)函数,可以用ajax代替setTimeout部分
 var delay = function() {
     setTimeout(function() {
         // do something ...
         // 在异步体内发射一个成功或失败的信号,就会对应then里面成功或失败的处理函数
         // 比如这里我们发射处理成功信号到 promise 里面
         promise.resolve('处理成功');
         // promise.reject('处理失败');
     }, 1000);
     // 返回 promise
     return promise;
 };
 // 这个函数用来处理成功信号
 var callback1 = function(re) {
     // do something ...
     alert(re);
 };
 // 这个函数用来处理失败信号
 var callback2 = function(re) {
     // do something ...
     alert(re);
 };
 // then里面传了两个函数,但是最终只会调用一个函数,根据成功或失败的信号来决定调用那个
 // delay里面发射的成功信号就调用 callback1 否则调用 callback2
 delay().then(callback1,callback2);
 // 看上面架子可以知道 promise 对象最后是 return this ;也就是返回的也是 promise
 // 可以实现链式操作  ,比如  delay().then(callback1,callback2).then(callback1,callback2);
js自带的Promise 用法完全一样;
 function loadMusic(url) {
     // Promise 的参数是一个函数  而这个函数里面包含两个参数  这两个参数实际上就是 Promise对象的方法
     // 注意 下面调用 Promise 对象的 then 方法传的两个函数作为参数 两者是对应的
     return new Promise(function(resolve, reject) {
         var audio = new Audio();
         audio.src = url;
         //  当你插入一个audio标签的时候,浏览器要联网加载,根据网络好坏加载到数据的时间就不同
         //  所以这个过程就是异步的,当加载到一定数据能够播放后就会触发这个事件,
         audio.addEventListener('canplay', function() {
             resolve(audio);
         });
         //  比如歌曲地址错误 无法加载到音频  触发这个事件
         audio.addEventListener('error', function(){
             reject("not found!");
         });
     });
 }
 loadMusic('/path/music.mp3').then(function(audio) {
     audio.play();
 }, function(notify) {
     alert(notify);
 });
javascript 中 Promise的使用的更多相关文章
- 全面理解Javascript中Promise
		全面理解Javascript中Promise 最近在学习Promise的时候,在网上收集了一些资料,发现很多的知识点不够系统,所以小编特意为大家整理了一些自认为 比较好的文章,供大家更好地学习js中非 ... 
- JavaScript中 Promise的学习以及使用
		今天一个哥们发过来一段js代码,没看懂,就顺便学习了一下,代码如下 Promise.resolve('zhangkai').then(value => {console.log(value)} ... 
- 浅谈Javascript中Promise对象的实现
		https://segmentfault.com/a/1190000000684654 What? Promise是CommonJS的规范之一,拥有resolve.reject.done.fail.t ... 
- Javascript中Promise的简单使用
		// 函数功能:1秒以后创建一个10以内的随机整数,并判断这个数是否为偶数:如果是偶数则做一件事情,如果是奇数则做另一件事情 function doSomthing() { var promise = ... 
- JavaScript中Promise 使用、原理以及实现过程
		1.什么是 Promise promise 是目前 JS 异步编程的主流解决方案,遵循 Promises/A+ 方案. 2.Promise 原理简析 (1)promise 本身相当于一个状态机,拥有三 ... 
- Javascript中Promise对象的实现
		http://segmentfault.com/a/1190000000684654 http://www.infoq.com/cn/news/2011/09/js-promise/ 
- 通过一道笔试题浅谈javascript中的promise对象
		因为前几天做了一个promise对象捕获错误的面试题目,所以这几天又重温了一下promise对象.现在借这道题来分享下一些很基础的知识点. 下面是一个面试题目,三个promise对象捕获错误的例子,返 ... 
- javascript中的promise和deferred:实践(二)
		javascript中的promise和deferred:实践(二) 介绍: 在第一节呢,我花了大量的时间来介绍promises和deferreds的理论.现在呢,我们来看看jquery中的promi ... 
- JavaScript中的Promise【期约】[未完成]
		JavaScript中的Promise[期约] 期约主要有两大用途 首先是抽象地表示一个异步操作.期约的状态代表期约是否完成. 比如,假设期约要向服务器发送一个 HTTP 请求.请求返回 200~29 ... 
随机推荐
- WPF多源绑定
			将控件绑定到多个数据源,ListBox绑定到一个集合,其中每一项绑定到集合中对象的两个属性,并对绑定进行了格式化. <ListBox ItemsSource="{StaticResou ... 
- Mac入门 (二) 使用VMware Fusion虚拟机
			有了Mac机,还是需在Mac上用Windows怎么办?, VMware Fusion 是运行在Mac机上的虚拟机软件, 类似于VMware workstation. 这样就可以在Mac上运行Windo ... 
- 使用python处理子域名爆破工具subdomainsbrute结果txt
			近期学习了一段时间python,结合自己的安全从业经验,越来越感觉到安全测试是一个体力活.如果没有良好的coding能力去自动化的话,无疑会把安全测试效率变得很低. 作为安全测试而言,第一步往往要通过 ... 
- 用AVFoundation自定义相机拍照
			自定义拍照或者录视频的功能,就需要用到AVFoundation框架,目前我只用到了拍照,所以记录下自定义拍照用法,视频用法等用上了再补充,应该是大同小异 demo在这里:https://github. ... 
- Andriod 自定义控件之音频条
			今天我们实现一个直接继承于View的全新控件.大家都知道音乐播放器吧,在点击一首歌进行播放时,通常会有一块区域用于显示音频条,我们今天就来学习下,播放器音频条的实现. 首先我们还是先定义一个类,直接继 ... 
- 分享一个ReactiveCocoa的很好的教程(快速上手)
			这是我看到的比较全而且讲的很好的文章 https://www.raywenderlich.com/62796/reactivecocoa-tutorial-pt1 https://www.raywen ... 
- 安装Nginx服务
			Nginx最大特点: 静态小文件(1M),支持高并发,同时占用系统资源很少.3W并发,10个进程,内存150M. Nginx特点: 1.配置简单,灵活,轻量. 2.高并发(静态小文件),静态几万的并发 ... 
- APUE学习之三个特殊位 设置用户ID(set-user-ID),设置组ID(set-group-ID),sticky
			设置用户ID(set-user-ID),设置组ID(set-group-ID),sticky set-user-ID: SUID 当文件的该位有设置时,表示当该文件被执行时,程序具有文件 ... 
- 理解Docker(3):Docker 使用 Linux namespace 隔离容器的运行环境
			本系列文章将介绍Docker的有关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ... 
- Common Bugs in C Programming
			There are some Common Bugs in C Programming. Most of the contents are directly from or modified from ... 
