学习记录,加深印象
JavaScript是单线程,因此JavaScript中的浏览器事件、网络操作需要异步执行,而异步执行可以用回调函数实现
function callback() { console.log('Done'); } console.log('before setTimeout()'); setTimeout(callback, 1000); // 1秒钟后调用callback函数 console.log('after setTimeout()'); callback回调函数,作为JundgeNum的参数 function JundgeNum(num,callback){ if(num<0) return setTimeout(callback,1000,1) setTimeout(callback,1000,null,num) //null,num表示callback的一二参数 } JundgeNum(2,function(err,succ){ if(err) console.log('数字小于0') else //当callback中err参数为null时 console.log('成功,数字为'+succ) }) console.log('test') //test //成功,数字为2 (1秒后出现) 将callback的两个参数(err,succ)拆开为两个函数来看,分别作为JundgeNum的两个参数 function JundgeNum(num,succ,err) { if(num<0) return setTimeout(err, 1000) setTimeout(succ, 1000) } JundgeNum(1,function(){ console.log('成功,数字大于0') },function(){ console.log('err数字小于0') }) console.log('test') //test //成功,数字大于0回调套回调,当回调嵌套很深时,就称为回调地狱
function JundgeNum(num,succ,err){ if(num<0) return setTimeout(err, 1000,num) setTimeout(succ, 1000,num) } JundgeNum(2,function(num){ console.log(num) JundgeNum(4,function(num){ console.log(num) JundgeNum(3,function(num){ console.log(num) JundgeNum(5,function(num){ console.log(num) }) }) }) }) //4 //16 //9 //25Promise单纯的为了解决回调地狱的问题,并不能帮我们减少代码量
廖雪峰官方网站例子
// 0.5秒后返回input*input的计算结果: function multiply(input) { return new Promise(function (resolve, reject) { console.log('calculating ' + input + ' x ' + input + '...'); setTimeout(resolve, 500, input * input); }); } // 0.5秒后返回input+input的计算结果: function add(input) { return new Promise(function (resolve, reject) { console.log('calculating ' + input + ' + ' + input + '...'); setTimeout(resolve, 500, input + input); }); } var p = new Promise(function (resolve, reject) { console.log('start new Promise...'); resolve(2); }); p.then(multiply) .then(add) .then(multiply) .then(add) .then(function (result) { console.log('Got value: ' + result); });