javascript - SOAP API 调用 Javascript 期间的 Async/Await 问题

标签 javascript node.js api

希望有人能指出我正确的方向。我在继续之前阅读了等待函数完成的内容,并决心使用等待/异步,但我现在陷入困境。

我尝试让 Async/Await 进程正常工作,尝试在各个位置注入(inject)等待,并将函数调整为异步,但我无法让 PSA_Resultbody 返回原始请求。任何指示将不胜感激。

谢谢,

CE

PSA_Resultbody = ProcessPSAAPI(xmlpackage, PSA_Action);
console.log("3 - Returned data:" + PSA_Resultbody);

调用以下内容:

async function ProcessPSAAPI(xmlpackage, PSA_Action) {  //psa action is part of the options

  var options = {...};
  var req = https.request(options, function (res) {
    var chunks = [];
    res.on("data", function (chunk) {
      chunks.push(chunk);
     });

    res.on("end", function (chunk) {
      var body =  Buffer.concat(chunks);
      console.log('0 - Start '+body.toString());
      if(res.statusCode != 200) {
         PSA_Resultcode = "Error: " +res.statusCode +" - "+ res.statusMessage;
        } else {
         PSA_Resultcode = "Success: " +res.statusCode +" - "+ res.statusMessage;
         PSA_Resultbody = ParseResults(body.toString()); //parse the results for later use  --SCRIPT NEEDS TO WAIT FOR RESULTBODY TO COMPLETE
                console.log("1 -PSA_Resultbody as part of RES = "+PSA_Resultbody);
        } 
     });
    res.on("error", function (error) {
      console.error(error);
      PSA_Resultcode = res.statusCode +" - "+ res.statusMessage;
     });

   });
   console.log('2 -RESULT BODY BEFORE SENDING BACK TO INITIATING FUNCTION: '+PSA_Resultbody);
   req.write(xmlpackage);
   req.end();
  return PSA_Resultbody;

基于上述,我的控制台日志顺序是:3,2,0,1,而不是0,1,2,3。

0 和 1 将具有正确的数据,因此 API 调用确实有效,但 2 将“未定义”,并且应具有与 1 中相同的数据。

最佳答案

没有办法等待事件发射器,因此在这种情况下使用异步是没有用的。您也无法从事件内部“返回”。

这里的解决方案是返回一个新的自定义 promise 并在发射器的“end”事件内使用resolve()。

它看起来像这样:

function ProcessPSAAPI(xmlpackage, PSA_Action) {
  return new Promise( (resolve, reject) => {
    // other code
    res.on("end", function (chunk) {
      // other code
      resolve(PSA_Resultbody);
    });
    res.on("error", function (error) {
      // other code
      reject(error);
    });
  });
}

这是一个quick tutorial关于创建你自己的 promise ,我写这些 promise 是为了简化对该主题的理解(官方文档有点干燥和复杂)。

关于javascript - SOAP API 调用 Javascript 期间的 Async/Await 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59581877/

相关文章:

api - Foursquare:有 field 照片/照片但没有 field /探索?

javascript - 在 HTML/JavaScript 中获取多个 <span> 标签的值?

javascript - 移除 HTML5 输入类型 ="time"出现的箭头

node.js - 使用 Socket.io 在 mongodb 中插入数据

php - 我们可以通过点击链接传递 $_POST 值吗?

azure - 使用 API 从 NetSuite 文件柜下载文件

javascript - Node Js : Test to see if a file is locked for editing by another process

javascript - CommonJS 规范中概述的 define() 协议(protocol)给我带来了什么?

json - 如果 URL 是动态的,如何将 Node.js 应用程序部署到 Heroku

javascript - Node.js 和 jdbc : TypeError: Cannot read property 'url' of undefined