繁体   English   中英

在移动下一步之前等待 api 响应 - 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 的方式

https://javascript.info/async-await

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM