Javascript Nodejs从嵌套函数返回结果

Javascript Nodejs从嵌套函数返回结果,javascript,node.js,xml,async-await,request,Javascript,Node.js,Xml,Async Await,Request,我很难理解如何在JS中操作堆栈 希望这个练习能对我有所帮助 因此,我尝试编写一个函数来进行soapxml调用并解析数据。然后在调用时返回已解析的数据 我可以在调用函数时将结果记录到console.log中,但我无法让它返回结果,因此我可以将其存储在变量ect中。。它返回undefined 代码如下: var request = require('request'); var DOMParser = require('xmldom').DOMParser; function query (ent

我很难理解如何在JS中操作堆栈 希望这个练习能对我有所帮助

因此,我尝试编写一个函数来进行soapxml调用并解析数据。然后在调用时返回已解析的数据

我可以在调用函数时将结果记录到console.log中,但我无法让它返回结果,因此我可以将其存储在变量ect中。。它返回undefined

代码如下:

var request = require('request');
var DOMParser = require('xmldom').DOMParser;

function query (entity,field,op,expression,elementToParse){
   xml = 
        `<?xml version="1.0" encoding="utf-8"?>
           <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xmlns:xsd="http://www.w3.org/2001/XMLSchema">
           <soap:Header>
           <AutotaskIntegrations xmlns="http://autotask.net/ATWS/v1_6/">
           <IntegrationCode>H2FATPVKPDN25IXIBSMN5K66XAA</IntegrationCode>
           </AutotaskIntegrations>
           </soap:Header>
           <soap:Body>
           <query xmlns="http://autotask.net/ATWS/v1_6/">
           <sXML><![CDATA[<queryxml><entity>${entity}</entity><query><field>${field}<expression 
           op="${op}">${expression}</expression></field></query></queryxml>]]></sXML>
           </query>
           </soap:Body>
           </soap:Envelope>`;


   options = {
      'method': 'POST',
      'url': 'https://webservices15.autotask.net/ATServices/1.6/atws.asmx',
      'headers': {
         'Content-Type': 'text/xml',
         'Authorization':'Auth Goes Here'
      },

      body: xml

      };

    request(options, function (error, response) { 
      if (error) throw new Error(error);
       text =  response.body;
       parser =  new DOMParser();
       xmlDoc =  parser.parseFromString(text,"text/xml");
       xmlResult = xmlDoc.getElementsByTagName(`${elementToParse}`)[0].childNodes[0].nodeValue;
       **console.log(xmlResult)**
      });
}

query('Ticket','TicketNumber','BeginsWith','T2019','id') 
// returns result if i log the data in REQUEST
//returns undefined otherwise
var request=require('request');
var DOMParser=require('xmldom')。DOMParser;
函数查询(实体、字段、运算、表达式、elementToParse){
xml=
`
H2FATPVKPDN25IXIBSMN5K66XAA
${entity}${field}${expression}]>
`;
选项={
'method':'POST',
“url”:”https://webservices15.autotask.net/ATServices/1.6/atws.asmx',
“标题”:{
“内容类型”:“text/xml”,
“授权”:“授权在这里”
},
正文:xml
};
请求(选项、函数(错误、响应){
如果(错误)抛出新错误(错误);
text=response.body;
parser=新的DOMParser();
xmlDoc=parser.parseFromString(text,“text/xml”);
xmlResult=xmlDoc.getElementsByTagName(`${elementToParse}`)[0].childNodes[0].nodeValue;
**console.log(xmlResult)**
});
}
查询('Ticket'、'TicketNumber'、'BeginsWith'、'T2019'、'id')
//如果我在请求中记录数据,则返回结果
//否则返回未定义的值
您应该使用以下命令对未来事件做出反应,并处理JavaScript中的异步代码执行:

var request=require('request');
var DOMParser=require('xmldom')。DOMParser;
函数查询(实体、字段、运算、表达式、elementToParse){
xml=
`
H2FATPVKPDN25IXIBSMN5K66XAA
${entity}${field}${expression}]>
`;
选项={
'method':'POST',
“url”:”https://webservices15.autotask.net/ATServices/1.6/atws.asmx',
“标题”:{
“内容类型”:“text/xml”,
“授权”:“授权在此进行”
},
正文:xml
};
returnnewpromise((resolve,reject)=>{//返回一个承诺,以便在调用`query'时处理它`
请求(选项、功能(错误、响应){
如果(错误){
拒绝(新错误(Error));//拒绝而不是抛出,用'catch'处理`
返回;
}
text=response.body;
parser=新的DOMParser();
xmlDoc=parser.parseFromString(text,“text/xml”);
xmlResult=xmlDoc.getElementsByTagName(`${elementToParse}`)[0].childNodes[0].nodeValue;
resolve(xmlResult);//使用'then'处理resolve而不是返回`
});
})
}
查询('Ticket','TicketNumber','BeginsWith','T2019','id')
.then(xmlResult=>console.log(xmlResult))
.catch(err=>/*处理您在'query`*/)中拒绝的'new Error(Error)';

您无法返回结果。由于node.js网络是异步和非阻塞的,因此在获得数据之前,函数将返回。因此,您不能直接从函数返回它。相反,您必须使用回调或承诺在数据最终到达时进行通信。请参阅您的问题已标记为的副本,以获取完整的解释和示例。