微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在移动下一步之前等待 api 响应 - nodejs

如何解决在移动下一步之前等待 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 的方法

https://javascript.info/async-await

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。