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 ...
随机推荐
- php函数强大的 strtotime
使用strtotime可以将各种格式的时间字符串转换为时间戳 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 转换常规时间格式 echo date('Y-m-d H:i: ...
- js模仿ios select效果
github:https://github.com/zhoushengmufc/iosselect webapp模仿ios下拉菜单 html下拉菜单select在安卓和IOS下表现不一样,iossel ...
- Windows下Python中pip安装Pillow报错总结(转载)
遇到的俩种错误1.ValueError: zlib is required unless explicitly disabled using --disable-zlib, aborting 问题原因 ...
- 3种方法快速制作tpk文件 [转]
tpk是ArcGIS10.1推出的一种新的数据文件类型,主要是用于将切片文件打包形成离线地图包,tpk可以在ArcGIS Runtime或者ArcGIS for Android/iOS中作为切片底图被 ...
- iOS 生成二维码
首先先下载生成二维码的支持文件 libqrencode 添加依赖库 CoreGraphics.framework. QuartzCore.framework.AVFoundation.framewor ...
- Android面试题--事件处理
1.Handler 机制 Android 中主线程也叫 UI 线程,那么从名字上我们也知道主线程主要是用来创建.更新 UI 的,而其他耗时操作,比如网络访问,或者文件处理,多媒体处理等都需要在子线程中 ...
- Action.c(58): Error -27796: Failed to connect to server "hostname"
分析: 因为负载生成器的性能太好发数据特别快,服务器响应也特别快,从而导致负载生成器的端口在没有timeout之前就全部占满了. 解决方案一: 在负载生成器的注册表HKEY_LOCAL_MACHI ...
- Kali v2.1.2 for Raspberry Pi 3B
最新的下载地址是: https://www.offensive-security.com/kali-linux-arm-images/ 按照官网的说法是找不到树莓派版本的SHA1SUM和SHA1SUM ...
- 【转】最流行的编程语言JavaScript能做什么?
本文转自互联网! 首先很遗憾的一点是,“PHP虽然是最好的语言”,但是它不是最流行的语言. 对不起的还有刚刚在4月TIOBE编程语言排行榜上榜的各个语言: 你们都很棒,但是你们都担当不了这个大任. 开 ...
- 我的2013 Q.E.D
"旧历的年底毕竟最像年底,村镇上不必说,就在天空中也显出将到新年的气象来.灰白色的沉重的晚云中间时时发出闪光,接着一声钝响,是送灶的爆竹:近处燃放的可就更强烈了,震耳的大音还没有息,空气里已 ...