首页 > 其他 > 详细

Promise的理解

时间:2019-06-08 20:12:58      阅读:95      评论:0      收藏:0      [点我收藏+]

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);
});

 

Promise的理解

原文:https://www.cnblogs.com/ning123/p/10991471.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!