浅谈node.js中async异步编程
什么是异步编程
在javascript中常见的编程模式是同步编程,也就是当代码中存在正在执行的任务时,代码会阻塞等待该任务完成后再继续执行下一条语句。在异步编程中,我们会把任务递交给回调函数,而该任务的执行过程中不会阻塞后续代码的执行。异步编程使我们的程序可以更有效地利用系统资源和提高性能。
在node.js中,异步编程尤其重要,因为它通常用于I / O密集型任务(如网络请求、文件读写操作等),这些往往是需要等待时间很长的瓶颈操作。
async库的使用
async是一个很常见的异步编程库,它提供了很多有用的函数,包括串行执行、并行执行、控制并发数量等。我们可以通过以下步骤来使用async来实现异步编程:
- 安装async
bash
npm install async
- 引入async
javascript
const async = require('async');
- 使用async函数
javascript
async.waterfall(tasks, callback);
以上是使用async函数的基本步骤,我们传递一个数组(tasks)包含了需要按顺序执行的任务,以及一个回调函数(callback)来处理执行完所有任务后的结果。当然,async还提供了很多其他的函数来处理不同的任务。
串行执行任务
串行执行任务是按照一定的顺序一个个执行任务。比如我们需要按照以下步骤执行任务:
- 读取文件内容
- 将文件内容转换成数组
- 对数组进行排序
- 将排序后的数组写入文件
我们可以使用async.series函数来按照顺序执行这些任务:
const fs = require('fs');
async.series([
function readData(callback) {
fs.readFile('data.txt', 'utf8', function(err, data) {
if (err) {
return callback(err);
}
const arr = data.split('\n').map(val => parseFloat(val));
return callback(null, arr);
});
},
function sortData(arr, callback) {
const sortedArray = arr.sort(function(a, b) {
return a - b;
});
return callback(null, sortedArray);
},
function writeData(sortedArray, callback) {
fs.writeFile('sorted-data.txt', sortedArray.join('\n'), 'utf8', function(err) {
if (err) {
return callback(err);
}
return callback(null, 'Done writing file');
});
}
], function(err, results) {
if (err) {
console.log('Error: ', err);
} else {
console.log('Results: ', results);
}
});
在以上示例中,我们通过async.series函数依次执行了三个任务(readData、sortData和writeData),第一个任务会读取文件内容,第二个任务会对文件内容进行排序,第三个任务会将排好序的数据写回一个新的文件。 在tasks数组中,每个并行任务都需要一个前置任务的执行结果数组,但第一个任务没有依赖,我们调用它并传递一个回调函数来获取执行结果数组。
并行执行任务
并行执行任务是将多个任务同时执行,当所有任务完成后执行回调函数。比如我们想要从三个URL中获取数据,我们可以使用async.parallel来实现并行执行任务:
const request = require('request');
async.parallel([
function(callback) {
request('https://jsonplaceholder.typicode.com/todos/1', function (error, response, body) {
if (!error && response.statusCode === 200) {
return callback(null, JSON.parse(body));
} else {
return callback(error);
}
});
},
function(callback) {
request('https://jsonplaceholder.typicode.com/todos/2', function (error, response, body) {
if (!error && response.statusCode === 200) {
return callback(null, JSON.parse(body));
} else {
return callback(error);
}
});
},
function(callback) {
request('https://jsonplaceholder.typicode.com/todos/3', function (error, response, body) {
if (!error && response.statusCode === 200) {
return callback(null, JSON.parse(body));
} else {
return callback(error);
}
});
}
], function(err, results) {
if (err) {
console.log('Error: ', err);
} else {
console.log('Results: ', results);
}
});
在以上示例中,我们使用了async.parallel函数来同时请求三个URL并获取它们的响应。当所有任务完成后,我们会在回调函数中获取所有任务的执行结果。
总结
通过使用async库,我们可以更加容易地完成异步编程。我们可以使用async.series函数来按照顺序执行任务,使用async.parallel函数来并行执行任务。此外,async还提供了其他一些有用的函数,如async.waterfall和async.map等。我们可以根据不同应用场景来选择不同的函数将帮助我们更有效率的完成任务。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈node.js中async异步编程 - Python技术站