我正在尝试使用NodeJS学习异步编程,但是在理解如何创建可用函数方面遇到了麻烦。
我正在尝试比较HTTP get请求的结果和在“ express”回调中读取的所有文件的结果。将两个不同的异步操作分解为各自的函数,以便可以在不同的回调中再次使用它们的最佳方法是什么?
当我在Express回调中编写所有内容时,它可以正常工作
app.get('/', (req, res) => {
axios.get('http://127.0.0.1:8080')
.then(function(response) {
var http_data = response.data
// Do more stuff with data
fs.readFile('fwversion_current', 'utf8', function(err, contents) {
var file_data = contents.trim()
// Do more stuff with data
if (http_data == file_data) {
res.send("Match")
}
else {
res.send("No Match")
}
});
});
但是我希望有更多类似的东西,以便可以在其他地方使用这些相同的操作。我不确定到达那里的正确方法。
function getHttpData() {
axios.get('http://127.0.0.1:8080')
.then(function(response) {
var http_data = response.data
// Do more stuff with data
return http_data
});
}
function getFileData() {
fs.readFile('fwversion_current', 'utf8', function(err, contents) {
var file_data = contents.trim()
// Do more stuff with data
return file_data
});
}
app.get('/', (req, res) => {
let http_data = await getHttpData()
let file_data = await getFileData()
if (http_data == file_data) {
res.send("Match")
}
else {
res.send("No Match")
}
});
答案 0 :(得分:1)
您需要将这些函数包装在返回Promise
的函数中,这将使您能够await
完成它们,然后再继续。
function getHttpData(url) {
// axios.get already returns a Promise so no need to wrap it
return axios.get(url)
.then(function(response) {
let http_data = response.data;
// Do more stuff with data
return http_data;
});
}
function getFileData(path) {
return new Promise(function(resolve, reject) {
fs.readFile(path, function(err, contents) {
if (err) {
reject(err);
return;
}
let file_data = contents.trim();
// Do more stuff with data
resolve(file_data);
});
});
}
现在,当两个functions
都返回Promise
时,我们可以await
来完成它们。
为处理程序添加一个async function
,因为需要使用await keyword
,我正在使用Promise.all
来同时触发两个请求,而不是等待一个请求完成才触发另一个请求
将其包装在try catch
中以处理errors
并发送状态500
app.get('/', async (req, res) => {
try {
const [http_data, file_data] = await Promise.all([
getHttpData(url),
getFileData(path),
]);
http_data == file_data
? res.send('Match')
: res.send('No Match');
} catch (err) {
console.error(err);
res.status(500).send('Something went wrong');
}
});