同步和异步promise
进程和线程
-
进程(厂房):程序的运行环境
-
线程(工人):进行运算的东西
同步和异步
-
同步:一件事干完才去干下一件事,前面的代码不执行,后面的代码也不执行。同步的代码可能会出现阻塞情况。
Java 和 pathon 中都是通过多线程解决阻塞。
node.js通过异步解决
-
异步:一段代码的执行不会影响到其他代码。
console.log("11111111");
function sum(a, b, cb) {setTimeout(() => {cb(a + b);});
}
sum(123, 456, (result) => {console.log(result);
});
console.log("22222222");
异步相加的结果上再加 777
console.log("11111111");
function sum(a, b, cb) {setTimeout(() => {cb(a + b);});
}
sum(123, 456, (result) => {sum(result, 777, (result) => {console.log(result);});
});
console.log("22222222");
上述代码可以看出,出现了回调地狱,可读性差、代码调试不方便。
解决问题:需要一个东西,代替回调函数返回结果。
promise
异步必须通过回调函数来返回结果。promise 是用来存储数据的容器,可以存储异步调用的结果。
promise解决回调地狱
// 错误的示例,写了一个promise的回调地狱
function sum(a, b) {return new Promise((resolve, reject) => {setTimeout((a, b) => {resolve(a + b);});});
}sum(123, 456).then((result) => {sum(result, 7).then((result) => {sum(result, 8).then((result) => {console.log(result);});});
});
promise.then() 返回值也是一个 promise 对象,所以可以有 promise.then().then() 的形式
promise 的链式调用:
sum(123, 456).then((result) => {return result + 7;}).then((result) => { // 来自上一个 result + 7return result + 8;}).then((result) => { // 来自上一个 result + 8return result + 9;}).then((result) => { // 来自上一个 result + 9console.log(result);});
宏任务微任务
执行顺序:调用栈、微任务队列、宏任务队列
async 和 await
通过async可以创建一个异步函数,异步函数的返回值会自动封装到promise中
function fn(){return Promise.resolve(10)
}
和
async function fn2(){return 10
}
效果一样
await 不会阻塞异步函数之外的代码执行,只会阻塞当前异步函数在 await之后的代码