理解promise 定时器回调

1.promise 函数

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolvereject。它们是两个函数,由 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中的回调函数

你可能感兴趣的:(javascript)