![](/img/trans.png)
[英]Wait for API to return its response before executing the next iteration in nodejs
[英]wait for api response before moving next - nodejs
在我的nodejs
项目中,有一个 function 我有两个查询可以从中获取数据。 第一个查询依赖于一个标志,如果标志为真,那么我必须运行该查询并将其数据传递给第二个查询。 否则我必须为第二个查询设置一些硬编码数据。 但它不会等待第一个查询响应并运行第二个查询。 我已经为其添加了回调,但对我没有任何帮助。 这是我的代码片段;
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, (err, results) => {
if (err) return callback(err);
return callback(null, { amounts: results });
});
}
];
asyncFuncs.push(callback => {
dao.thirdFunction(id, callback);
});
async.parallel(asyncFuncs, (err, 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
是 true 还是 false, getSecondData
总是返回针对d
(硬编码值)的数据。 我是nodejs
的新手,所以请让我知道我做错了什么。
所以我更新了我的代码以在其中添加 promise ......这是更新的代码;
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 , (err, 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, (err, results) => {
if (err) return callback(err);
return callback(null, { amounts: results });
});
}
];
asyncFuncs.push(callback => {
dao.thirdFunction(id, callback);
});
async.parallel(asyncFuncs, (err, results) => {
if (err) return callback(err);
let data1= results[0].amount;
let data2= results[1];
// some calculations with data1 & data2
return callback(err, finalResult);
});
}
但还是一样的反应。 它不等待 promise 结果。
有很多方法可以实现这一点,但我更喜欢http://async.io/来执行多个 function 操作。
通过使用 promise 你可以做到,
function f1(argument){
return new Promise((resolve, reject) => {
try {
data = // do your thing
resolve(data)
}
catch(err){
reject(err)
}
})
}
然后使用 await 来实现这一点
async function caller(){
await f1()
}
很少有其他链接可以帮助您 [这里][2]
[2]: https://stackoverflow.com/questions/22442321/callback-function-example/48333938#:~:text=A%20callback%20function%2C%20is%20a,or%20executed )%20inside%20the% 20otherFunction.&text=没有%20thinking%20too%20much%2C%20see%20the%20following%20example.&text=一般%2C%20JavaScript%20allows%20function%20as%20a%20参数。
您可以使用 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, (err, results) => {
if (err) return callback(err);
return callback(null, { amounts: results });
});
}
];
}
要掌握这一点,您可以检查使用 async/await 的方式
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.