如何解决在移动下一步之前等待 api 响应 - nodejs
在我的 nodejs
项目中,有一个函数,我有两个查询可以从中获取数据。第一个查询取决于一个标志,如果标志为真,那么我必须运行该查询并将其数据传递给第二个查询。否则我必须为第二个查询设置一些硬编码数据。但它不会等待第一个查询响应并运行第二个查询。我已经向它添加了回调,但对我没有任何作用。这是我的代码片段;
getData(req,callback) {
if(!req.flag){
lstData.push('d');// hardcoded data
return Reader.open(filename).then(reader => {
let code = reader.data;
if(!!code ){
return dao.getFirstData(code,(err,results) => {
if (err) return callback(err);
if(results && results.length > 0){
return lstData = results;
}
});
}
});
}
else{
lstData.push('d');// hardcoded data
}
let asyncFuncs = [
(callback) => {
dao.getSecondData(lstData,results) => {
if (err) return callback(err);
return callback(null,{ amounts: results });
});
}
];
asyncFuncs.push(callback => {
dao.thirdFunction(id,callback);
});
async.parallel(asyncFuncs,results) => {
if (err) return callback(err);
let data1= results[0].amount;
let data2= results[1];
// some calculations with data1 & data2
return callback(err,finalResult);
});
}
无论 flag
是真还是假,getSecondData
始终返回针对 d
(硬编码值)的数据。我是 nodejs
的新手,所以请告诉我我做错了什么。
所以我更新了我的代码以在其中添加承诺...这里是更新的代码;
getData(req,callback) {
if(!req.flag){
lstData.push('d');// hardcoded data
Reader.open(filename).then(reader => {
let code = reader.data;
if(!!code ){
var prom = new Promise((resolve,reject) => {
dao.getFirstData(code,results) => {
if (err) return callback(err);
if(results && results.length > 0){
let lstData = results;
return resolve(lstData);
}
});
});
prom.then((result) => {
return result;
});
}
});
}
else{
lstData.push('d');// hardcoded data
}
let asyncFuncs = [
(callback) => {
dao.getSecondData(lstData,finalResult);
});
}
但还是一样的反应。它不是在等待承诺结果。
解决方法
您可以使用 async/await 进行异步调用,也可以使用 Promise。这将等待异步调用,一旦您获得响应,您的代码将执行相关的后续调用。
getData(req,callback) {
if(!req.flag){
lstData.push('d');// hardcoded data --> this might be an issue as you are already pushing data.
// these are async calls where you can ask your code to wait
return Reader.open(filename).then(reader => {
let code = reader.data;
if(!!code ){
var promise = dao.getFirstData(code,(err,results) => {
if (err) reject(err);
if(results && results.length > 0){
lstData = results;
resolve(lstData);
}
});
return promise --> you can subscribe this using then
}
});
}
else{
lstData.push('d');// hardcoded data
}
let asyncFuncs = [
(callback) => {
dao.getSecondData(lstData,results) => {
if (err) return callback(err);
return callback(null,{ amounts: results });
});
}
];
}
要掌握这个,您可以检查使用 async/await 的方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。