Мыло NodeJS NPM - как связать асинхронные методы без обратных вызовов (т. Е. Использовать async или Promise)? - PullRequest
0 голосов
/ 28 июня 2019

Я успешно вызвал последовательность методов мыльного веб-сервиса, используя nodejs / javascript, но с помощью обратных вызовов ... сейчас это выглядит примерно так:

soap.createClient(wsdlUrl, function (err, soapClient) {
    console.log("soap.createClient();");
    if (err) {
        console.log("error", err);
    }
    soapClient.method1(soaprequest1, function (err, result, raw, headers) {
        if (err) {
            console.log("Security_Authenticate error", err);
        }
        soapClient.method2(soaprequest2, function (err, result, raw, headers) {
                if (err) {
                    console.log("Air_MultiAvailability error", err);
                }
                //etc... 
        });
    });

});

Я пытаюсь получить что-то более чистое с помощью Promise или async, похожего на это (на примере, приведенном в документации здесь https://www.npmjs.com/package/soap):

var soap = require('soap');

soap.createClientAsync(wsdlURL)
    .then((client) => {
        return client.method1(soaprequest1);
    })
    .then((response) => {
        return client.method2(soaprequest2);
    });//... etc

Моя проблема в том, что в последнем примере мыльный клиент больше не доступен после первого вызова и обычно возвращает ошибку «не определено» ...

существует ли «чистый» способ переноса объекта через этот вид цепочки для использования / доступа при последующих вызовах?

Ответы [ 2 ]

6 голосов
/ 28 июня 2019

Использовать async/await синтаксис.

const soap = require('soap');

(async () => {
const client = await soap.createClientAsync(wsdlURL);
cosnt response = await client.method1(soaprequest1);
await method2(soaprequest2);
})();
1 голос
/ 28 июня 2019

Чтобы цепочка обещаний была плоской, вы можете назначить экземпляр мыла переменной во внешней области видимости:

let client = null;

soap.createClientAsync(wsdlURL)
  .then((instance) => {
    client = instance
  })
  .then(() => {
    return client.method1(soaprequest2);
  })
  .then((response) => {
    return client.method2(soaprequest2);
  });

Другой вариант - вызов метода вложенной цепочки после разрешения клиента:

soap.createClientAsync(wsdlURL)
  .then((client) => {
    Promise.resolve()
      .then(() => {
        return client.method1(soaprequest2);
      })
      .then((response) => {
        return client.method2(soaprequest2);
      });
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...