如何在 meteor 中使 webservice 调用同步
How to make a webservice call synchronous in meteor
我正在尝试在 meteor 中同步调用一个简单的天气服务。我什至无法让客户端同步创建。在下面的代码中,我希望 user.testData 包含 "test data" 但它什么都不包含。
if (Meteor.isClient) {
Template.confirmWeather.onRendered(function(){
var validator = $('.confirmWeatherAndGoToMessage').validate({
submitHandler: function(event){
Meteor.bindEnvironment(Meteor.call('testWeather',Meteor.bindEnvironment(function(error,result)
{
if (error)
{
console.log(error.message)
}
else
{
var userId = Meteor.userId();
var user = Meteor.users.findOne({_id: userId});
if (user.testData)
{
console.log(user.testData);
}
}
})));
}
});
});
}
if (Meteor.isServer) {
Meteor.methods({
testWeather: function () {
var soap = Npm.require('soap');
var options = {
ignoredNamespaces: {
namespaces: [],
override: true
}
}
var url = 'http://www.webservicex.com/globalweather.asmx?WSDL';
Meteor.wrapAsync(soap.createClient(url, options,Meteor.bindEnvironment(function(err, client) {
if (err)
{
console.log("CREATE ERROR:");
console.log(err);
}
else
{
Meteor.wrapAsync(Meteor.call("insertIntoTestData","test data",function(err,res)
{
if (err)
{
throw new Meteor.Error("server-error",error.message);
}
else
{
console.log('DATA: ');
}
}));
}
})));
},
insertIntoTestData: function(data) {
var userId = Meteor.userId();
var user = Meteor.users.findOne({_id: userId});
if (user)
{
return resultId = Meteor.users.update({_id:userId},{$set:{testData:data}});
}
}
});
}
如果您无法使该方法奏效,也许我可以提供替代方法。当我需要与请求库进行同步调用时,我使用了不同的方法,使用来自 fibers/future nodejs 的未来库。在请求之后我只是把 "future.wait()" 和内部异步代码回调 "future.return(value)"。然后执行将等到请求完成并返回一个值。
link 这里也很好地解释了该方法的用法:https://themeteorchef.com/tutorials/synchronous-methods
此致,
恐龙
我正在尝试在 meteor 中同步调用一个简单的天气服务。我什至无法让客户端同步创建。在下面的代码中,我希望 user.testData 包含 "test data" 但它什么都不包含。
if (Meteor.isClient) {
Template.confirmWeather.onRendered(function(){
var validator = $('.confirmWeatherAndGoToMessage').validate({
submitHandler: function(event){
Meteor.bindEnvironment(Meteor.call('testWeather',Meteor.bindEnvironment(function(error,result)
{
if (error)
{
console.log(error.message)
}
else
{
var userId = Meteor.userId();
var user = Meteor.users.findOne({_id: userId});
if (user.testData)
{
console.log(user.testData);
}
}
})));
}
});
});
}
if (Meteor.isServer) {
Meteor.methods({
testWeather: function () {
var soap = Npm.require('soap');
var options = {
ignoredNamespaces: {
namespaces: [],
override: true
}
}
var url = 'http://www.webservicex.com/globalweather.asmx?WSDL';
Meteor.wrapAsync(soap.createClient(url, options,Meteor.bindEnvironment(function(err, client) {
if (err)
{
console.log("CREATE ERROR:");
console.log(err);
}
else
{
Meteor.wrapAsync(Meteor.call("insertIntoTestData","test data",function(err,res)
{
if (err)
{
throw new Meteor.Error("server-error",error.message);
}
else
{
console.log('DATA: ');
}
}));
}
})));
},
insertIntoTestData: function(data) {
var userId = Meteor.userId();
var user = Meteor.users.findOne({_id: userId});
if (user)
{
return resultId = Meteor.users.update({_id:userId},{$set:{testData:data}});
}
}
});
}
如果您无法使该方法奏效,也许我可以提供替代方法。当我需要与请求库进行同步调用时,我使用了不同的方法,使用来自 fibers/future nodejs 的未来库。在请求之后我只是把 "future.wait()" 和内部异步代码回调 "future.return(value)"。然后执行将等到请求完成并返回一个值。 link 这里也很好地解释了该方法的用法:https://themeteorchef.com/tutorials/synchronous-methods
此致,
恐龙