进程和线程
进程(厂房):程序的运行环境
线程(工人):进行运算的东西
同步和异步
同步:一件事干完才去干下一件事,前面的代码不执行,后面的代码也不执行。同步的代码可能会出现阻塞情况。
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 + 7
return result + 8;
})
.then((result) => { // 来自上一个 result + 8
return result + 9;
})
.then((result) => { // 来自上一个 result + 9
console.log(result);
});