JavaScript基础之Promise
来源:互联网 发布:知鱼之乐什么意思 编辑:程序博客网 时间:2024/06/07 14:20
在JavaScript的世界中,所有代码都是单线程执行的。
由于这个“缺陷”,导致JavaScript的所有网络操作,浏览器事件,都必须异步执行。异步执行可以用回调函数实现:
function callback(){ console.log('Done');}console.log('before setTimeout()');setTimeout(callback,1000);//1秒钟后调用callback函数console.log('after setTimeout()');
观察上述代码执行,在Chrome的控制台输出可以看到:
before setTimeout()after setTimeout()(等待1秒后)Done
可见,异步操作会在将来的某个时间点触发一个函数调用。
AJAX就是典型的异步操作。
request.onreadystatechange = function () { if (request.readyState === 4) { if (request.status === 200) { return success(request.responseText); } else { return fail(request.status); } }}
把回调函数success(request.responseText)和fail(request.status)写到一个AJAX操作里很正常,但是不好看,而且不利于代码复用。
有没有更好的写法?比如写成这样:
var ajax=ajaxGet('http://...');ajax.ifSuccess(success) .ifFail(fail);
这种链式写法的好处在于,先统一执行AJAX逻辑,不关心如何处理结果,然后,根据结果是成功还是失败,在将来的某个时候调用success函数或fail函数。
古人云:“君子一诺千金”,这种“承诺将来会执行”的对象在JavaScript中称为Promise对象。
我们先看一个最简单的Promise例子:生成一个0~2之间的随机数,如果小于1,则等待一段时间后返回成功,否则返回失败:
function test(resolve,reject){ var timeOut=Math.random()*2; log('set timeout to:'+timeOut+'seconds.'); setTimeout(function()){ if(timeOut<1){ log('call resolve()...'); resolve('200 OK'); }else{ log('call reject()...'); reject('timeout in'+timeOut+'seconds.'); } },timeOut*1000);}
这个test()函数有两个参数,这两个参数都是函数,如果执行成功,我们将调用resolve(’200 OK’),如果执行失败,我们将调用reject(‘timeout in’+timeOut_’seconds.’)。可以看出,test()函数只关心自身的逻辑,并不关心具体的resolve和reject将如何处理结果。
有了执行函数,我们就可以用一个Promise对象来执行它,并在将来某个时刻获得成功或失败的结果:
var p1=new Promise(test);var p2=p1.then(function(result){ console.log('成功:'+result);});var p3=p2.catch(function(reason){ console.log('失败:'+reason);});
变量p1是一个Promise对象,它负责执行test函数。由于test函数在内部是异步执行的,当test函数执行成功时,我们告诉Promise对象:
//如果成功,执行这个函数p1.then(function(result){ console.log('成功:'+result);});
当test函数执行失败时,我们告诉Promise对象:
p2.catch(function(reason){ console.log('失败:'+reason);});
promise对象可以串起来,所以上述代码可以简化为:
new Promise(test).then(function(result){ console.log('成功:'+result);}).catch(function(reason){ console.log('失败:'+reason);});
- JavaScript基础之Promise
- JavaScript异步之Promise
- JavaScript之Promise实现
- Promise 之基础篇
- (转载)Javascript 之 Promise
- JavaScript杂谈之promise揭秘
- 剖析 Promise 之基础篇
- 【windows8开发】异步编程之Promise(Javascript)
- 【windows8开发】异步编程之Promise(Javascript)
- Javascript中异步编程之Promise
- 深入理解javascript之初识promise
- javascript系列之使用Promise封装ajax
- JavaScript Promise
- javascript promise
- javascript: Promise
- Javascript Promise
- JavaScript Promise
- ES6基础之详解Promise基本用法
- HDU-2017 ACM/ICPC Asia Regional Qingdao Online-1003-The Dominator of Strings
- 使用wait/notify实现线程间通信
- 解决多实现引用的问题
- HDU 6214 Smallest Minimum Cut 2017青岛网赛1009(最小割最小割边)
- [校园网]UDP绕过校园网,纯手工搭建
- JavaScript基础之Promise
- 思维导图学习法——记忆曲线
- 构造方法
- [leetcode]435. Non-overlapping Intervals
- vi 翻页, 行首,行末命令
- GitHub Pages搭建个人博客
- LeetCode 001 :Two Sum
- 学好Hadoop的正确方式
- 简单易懂教会你KNN算法