1,什么是Promise
Promise对象用于异步操作,它表示一个尚未完成且预计在未来完成的异步操作。
1.1,同步和异步的概念
JavaScript的执行环境是单线程;
所谓单线程,是指JS引擎中负责解释和执行JavaScript代码的线程只有一个,也就是一次只能完成一项任务,这个任务执行完后才能执行下一个,它会「阻塞」其他任务。这个任务可称为主线程。
但实际上还有其他线程,如事件触发线程、ajax请求线程等。
1.1.1 同步
同步模式,一次只能执行一个任务,函数调用后需要等到函数执行结束,
返回执行结果,才能进行下一个任务。如果这个任务执行的时间较长。
就会导致线程阻塞。
var x = true; while(x); console.log("don‘t carry out"); //并不会执行这句
while是一个死循环,它会阻塞进程,因此后面的console并不会执行。
1.1.2 异步
异步与同步模式相反,可以一起执行多个任务。函数的调用不会立马返回执行结果。
如果A任务需要等待(如读取文件),可先执行B任务。等A任务结果返回再继续回调。
setTimeout(function(){ console.log(‘task A, asynchronous‘); },0); console.log(‘Task B, synchronous‘); -------output-------- task B, .... task A, ....
我们可以看到,定时器延时的时间明明是0,但是task A 还是比task B后执行。
原因是定时器是异步的,异步任务会在同步任务执行完之后才会执行。
因为同步任务阻塞了进程。
1.1.3 回调函数
异步,必须提到回调函数。
setTimeout里面的function就是回调函数。
可以理解为:执行完 调用的 函数。
回调函数不仅可以用于异步调用,一般的同步场景也可以回调。
同步:回调函数一般是最后执行;
异步:一段时间后执行或者不执行(没有达到执行条件)。
/* 同步回调 */ var fun1 = function( callback){ //do something console.log("before callback") ; (callback && typeof(callback) === ‘function‘) && callback(); console.log("after callback"); } var fun2 = function (param){ // do something var start = new Date(); while( (new Date() - start) ) < 3000 { // delay 3000ms } console.log("I‘am callback"); } fun1(fun2); ------output----- before callback //after 3000ms I ‘ am callback //再执行同步回调 after callback
1.2 为什么使用Promise
Promise是基于异步操作的。
既然我们可以使用异步回调的进行异步操作,为什么还要使用Promise呢?
function sendRequest(url , param){ return new Promise(fiunctiuon (resolve,reject) { request (url , param, resolve, reject); }); } sendRequest(‘test.html‘ , ‘ ‘ ).then (function(data) { //异步操作成功后回调 console.log(‘请求成功,这是返回的数据:‘ , data); } function (error){ //异步操作失败的回调 console.log(‘sorry,请求失败了,这是失败信息:’) ,error); } );
上述的Promise 的简单用法;
我们可以看到Promise 的强大的之处是:多重链式调用;
sendRequest(‘test1.html‘, ‘‘).then(function(data1) { console.log(‘第一次请求成功, 这是返回的数据:‘, data1); return sendRequest(‘test2.html‘, data1); }).then(function(data2) { console.log(‘第二次请求成功, 这是返回的数据:‘, data2); return sendRequest(‘test3.html‘, data2); }).then(function(data3) { console.log(‘第三次请求成功, 这是返回的数据:‘, data3); }).catch(function(error) { //用catch捕捉前面的错误 console.log(‘sorry, 请求失败了, 这是失败信息:‘, error); });
原文:https://www.cnblogs.com/ning123/p/10991471.html