同步-异步思考
同步: 一件事情执行结束后, 才能执行下一件事.
1. 只有一个线程:
2. 有两个线程:
上面两个模型都是在执行任务 2 的时候, 不会执行任务 3, 等任务 2 执行结束的时候才执行任务 3 伪代码: main() { 定义变量 a = 1; a = await get_number_two(); 打印 a 的值; }
async get_number_two() { sleep_s(10); // 睡眠 10 s return 2; } 结果: a 的值为 2.
异步: 干一件事的时候可以同时干另外一件事.
有点像一个人在用电饭煲煮米饭, 米饭放进去以后, 人就可以去干其他事, 当电饭煲发出滴的一声, 人就知道米饭熟了, 然后可以来处理煮熟的米饭.
但是我们在代码中如何知道异步中的代码什么时候执行结束呢(米饭什么时候煮熟呢)? 我又如何在异步代码结束以后, 进行下一步处理呢?
答案是回调函数: 我们假设现在有这样一种情况, 我们需要读取一个大文件(读取文件的过程大概需要 3 分钟.), 大文件读取进内存后, 对其中的字符串进行处理.
// 定义一个读取文件的异步函数,它接收文件名和回调函数作为参数
function readFileAsync(filename, callback) {
// 模拟异步读取文件操作
setTimeout(() => { const fileContent = "This is the content of the file.";
// 假设这是从文件读取的内容
callback(fileContent);
// 调用回调函数,并将文件内容作为参数传给它
}, 1000);
// 假设文件读取操作耗时1秒
}
// 定义了一个回调函数用于处理文件内容
function processFileContent(content) {
console.log("Processing file content:", content);
}
// 调用readFileAsync函数,读取文件,并指定processFileContent作为回调函数
readFileAsync("example.txt", processFileContent);