需要等待 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 转换为普通的匿名函数。
大家好这是我关于 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 转换为普通的匿名函数。