1.promise 函数
Promise
构造函数接受一个函数作为参数,该函数的两个参数分别是resolve
和reject
。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。
resolve
函数的作用是,将Promise
对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;reject
函数的作用是,将Promise
对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去
const promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 异步操作成功 */){
resolve(value);
} else {
reject(error);
}
});
promise.then(function(value) {
// success
}, function(error) {
// failure
});
2.异步任务可以分为两种:(1)追加在本轮循环的异步任务;(2)追加在次轮循环的异步任务。
上述的循环即事件循环,Node规定,process.nextTick和Promise的回调函数,追加在本轮循环,即同步任务一旦执行完毕,就开始执行它们。而setTimeout、setInterval、setImmediate的回调函数,追加在次轮循环。
console.log("a");
setTimeout(function(){console.log("b");},0);
console.log("c");
//依次打印 a -> c -> b
var i=0;
function create(){
var i=1;
return function(){
setTimeout(function(){
i++;
console.log('nibu:'+i);
},0);
console.log(i);
}
}
var print1=create();
print1();
print1();
var print2=create();
print2();
[Web浏览器] "1" /frontEnd/1217/3.html (19)
[Web浏览器] "1" /frontEnd/1217/3.html (19)
[Web浏览器] "1" /frontEnd/1217/3.html (19)
[Web浏览器] "nibu:2" /frontEnd/1217/3.html (17)
[Web浏览器] "nibu:3" /frontEnd/1217/3.html (17)
[Web浏览器] "nibu:2"
setTimeout(fn,time,args) 第三个参数作为fn 函数的传参传入。
流水灯:
timeout
方法返回一个Promise
实例,表示一段时间以后才会发生的结果。过了指定的时间(ms
参数)以后,Promise
实例的状态变为resolved
,就会触发then
方法绑定的回调函数。
function timeout(time,done){
return new Promise(function(resolve){
setTimeout(resolve,time,done);========》定时结束,
})
};
timeout(1000,'红灯亮了').then(function(value){
console.log(value);
// return new Promise(function(resolve){
// setTimeout(resolve,1000,'绿灯亮了');
return timeout(1000,'绿灯亮了')
})
.then(function(value){
console.log(value);
// return new Promise(function(resolve){
// setTimeout(resolve,1000,'蓝灯亮了');
return timeout(1000,'蓝灯亮了')
})
.then(function(value){
console.log(value);
//
})
console.log("a");
var p=new Promise(function(resolve){
console.log("b");
resolve();
});
console.log("c");
p.then(function(){
console.log("d");
});
console.log("e");
//依次打印 a -> b -> c -> e -> d
首先会执行同步任务,即打印a,需要注意的是Promise的实例化也属于同步任务,Promise的异步体现在then()和catch()中,因此接下来会打印b,Promise调用then()方法,其回调函数会放入任务队列中等候,待主线程的任务执行完毕,再执行then中的回调函数