我里面有一个 Meteor 方法,正在调用soap 函数。
Meteor 在收到来自肥皂客户端的响应之前正在执行所有语句。
所以我得到的结果是未定义的。
我想在执行方法中的其他语句之前承诺肥皂执行。
createSoapConnection(){
var Soap = require('soap');
var url = 'https://xxxxxx/index.php/api/v2_soap/?wsdl';
var args = {username: 'xxxxxx', apiKey: 'xxxxxx'};
let client = Soap.createClient(url, function(err, client){
let result = client.login(args, function(err, result) {
let sessionId = result.loginReturn.$value;
console.log(sessionId);
return {
conn: client,
sessionId: sessionId
};
});
});
}
我正在通过这个流星方法调用这个方法。
addsoapmessage(){
let a = Meteor.call("createSoapConnection");
console.log(a);
}
在控制台中,结果是未定义。之后会打印会话 ID。我该如何解决这个问题?
Meteor 方法不返回任何内容。您可以请求一个回调,该回调将在完成后触发,但回调不会传回返回值,如果找到返回值,只会返回一个错误。
处理这个问题的最好方法是获取将结果保存在集合中的方法,并依靠订阅让客户端反应性地看到它。
或者,您可以将返回的数据存储在服务器变量中,然后只能由服务器代码访问该变量(但这可能有效,因为其他服务器方法可能想要访问这些值。
在流星调用中实现回调函数
let a = Meteor.call("createSoapConnection", function (error, result) {
// display the error to the user and abort
if (error)
console.error(error.reason);
else {
console.log(result);
}
});
meteor add zardak:soap
将此软件包安装在应用程序文件夹的根目录中。然后尝试使用以下代码。
var url = 'http://example.com/wsdl?wsdl';
var args = {name: 'value'};
try {
var client = Soap.createClient(url);
var result = client.MyFunction(args);
return result; // or send this result to the function where ever you want.
}
catch (err) {
if(err.error === 'soap-creation') {
console.log('SOAP Client creation failed');
}
else if (err.error === 'soap-method') {
console.log('SOAP Method call failed');
}
}
您可以使用这些函数执行任何soap api 调用。欲了解更多详情,请访问:https://atmospherejs.com/zardak/soap
fuction(url,args)
{
soap = Npm.require('soap');
var createClient=Meteor.wrapAsync(soap.createClient,soap);
var client=createClient(url);
var finalFunc=Meteor.wrapAsync(client.youfunction,soap);
var result=finalFunc(args);
return result;
}