js是单线程的,浏览器是多线程的,其异步也得靠其他线程来监听事件的响应,并将回调函数推入到任务队列等待执行。单线程所做的就是执行栈中的同步任务,执行完毕后,再从任务队列中取出一个事件(没有事件的话,就等待事件),然后开始执行栈中相关的同步任务,不断的这样循环
deferred
function runAsync(){
var def = $.Deferred();
//做一些异步操作
setTimeout(function(){//模拟异步操作
def.resolve(‘随便什么数据’);
}, 2000);
return def;
}
runAsync().then(function(data){
console.log(data)
});
async await
var stop= function (time) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve();
}, time);
})
};
var start = async function () {
// 在这里使用起来就像同步代码那样直观
console.log(‘start’);
try{
await stop(3000);
}catch(err){
console.log(err);
}
console.log(‘end’);
};
start();
Promise.all Promise.race
let wake = (time) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(${time / 1000}秒后醒来
)
}, time)
})
}
let p1 = wake(3000)
let p2 = wake(2000)
Promise.all([p1, p2]).then((result) => {
console.log(result) // [ ‘3秒后醒来’, ‘2秒后醒来’ ]
}).catch((error) => {
console.log(error)
})
async await
await 返回一个新的promise 把异步处理同步化
fetch
ajax 的升级版, 返回promise 用then的方式获取数据