需要等待 soapClient 结果

need to wait for soapClient result

大家好这是我关于 Whosebug 的第一个问题。 我写了一个函数,期望 nodejs 中的 soapClient 调用产生结果,但它不等待调用 return,并且 return 值为空。

我尝试对代码进行多次修改,但无法获得预期的结果。 我期待一些输出,但它是空的。

注意 URL 是虚构的!!

谢谢有人可以帮助我!!


import * as soap from "soap";

function getTokens(service: string): String {

    let Auth = "";

    function Call(err: any, client: soap.Client) {

        client.loginCms({ in0: service }, function (
            err: any,
            result: any,
            _rawResponse: string, 
            _soapHeader: any,
            _rawRequest: string
        ) {
            if (err) {
                console.error(err);
             } else {
                Auth = result.loginCmsReturn;
             }
         });
    }

    soap.createClient("wsdl_url", {
        disableCache: true,
        envelopeKey: "env"
    }, Call, "endpoint_url");

    // here return an empty value
    return Auth;
};

const Auth = getTokens("service");
console.log(Auth); // empty

我建议您使用 this example 中的承诺,这些承诺取自 soap 包文档。

您的代码不是异步的,因此它不会等待操作完成。

它应该看起来像这样

import * as soap from "soap";

function getTokens(service: string): Promise<string> {

    return new Promise<string>((resolve, reject) => {

        function Call(err: any, client: soap.Client) {

            client.loginCms({ in0: service }, function (
                err: any,
                result: any,
                _rawResponse: string, 
                _soapHeader: any,
                _rawRequest: string
            ) {
                if (err) {
                    console.error(err);
                    reject(err)
                 } else {
                    Auth = result.loginCmsReturn;
                    resolve(Auth);
                 }
             });
        }

        soap.createClient("wsdl_url", {
            disableCache: true,
            envelopeKey: "env"
        }, Call, "endpoint_url");

    });
};

getTokens("service").then((Auth) => {
    console.log(Auth);
});

另请注意:

  • 我遵循你的变量名,但是以大写字母开头的标识符应该用于构造函数或class名称。
  • 同时检查您的 TypeScript/JavaScript/EcmaScript 版本以查看箭头函数(如我的示例)是否兼容。如果不是,您可以将 then 转换为普通的匿名函数。