【问题标题】:Nodejs Return result from nested function [duplicate]Nodejs从嵌套函数返回结果[重复]
【发布时间】:2020-05-11 01:18:05
【问题描述】:

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

所以我尝试编写一个函数来调用soap xml 并解析数据。然后在调用时返回解析后的数据。

当我调用该函数时,我可以将它发送到控制台。记录结果,但我无法让它返回结果,因此我可以将它存储在变量等中。它返回未定义。

代码如下:

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

【问题讨论】:

  • 您无法返回结果。因为 node.js 网络是异步且非阻塞的,所以您的函数将在您获得数据之前返回。因此,您不能直接从函数中返回它。相反,当数据最终到达时,您必须使用回调或承诺来回传数据。查看您的问题已被标记为重复,以获得完整的解释和示例。

标签: javascript node.js xml async-await request


【解决方案1】:

您应该使用Promises 来响应未来的事件并处理 JavaScript 中的异步代码执行:

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

    };
    return new Promise((resolve, reject) => { // return a promise so that you can handle it when you invoke `query`

        request(options, function (error, response) {
            if (error) {
              reject(new Error(error)); // reject instead of throwing, handle with `catch`
              return;
            }
            text = response.body;
            parser = new DOMParser();
            xmlDoc = parser.parseFromString(text, "text/xml");
            xmlResult = xmlDoc.getElementsByTagName(`${elementToParse}`)[0].childNodes[0].nodeValue;
            resolve(xmlResult); // resolve instead of returning, handle with `then`
        });
    })
}

query('Ticket', 'TicketNumber', 'BeginsWith', 'T2019', 'id')
    .then(xmlResult => console.log(xmlResult))
    .catch(err => /* do something with that `new Error(error)` you rejected in `query`*/);

【讨论】:

    猜你喜欢
    • 2015-07-20
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 2019-07-31
    相关资源
    最近更新 更多