【问题标题】:How to make a webservice call synchronous in meteor如何在流星中同步 web 服务调用
【发布时间】:2017-06-02 23:34:35
【问题描述】:

我正在尝试在流星中同步调用一个简单的天气服务。我什至无法使客户端创建同步。在下面的代码中,我希望 user.testData 包含“测试数据”,但它什么都不包含。

    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}});
            }
        }
    });
}

【问题讨论】:

  • 您是否尝试将流星客户端和流星服务器之间的异步调用更改为同步?

标签: node.js meteor node-fibers


【解决方案1】:

如果您不能使这种方法发挥作用,也许我可以提供替代方案。当我需要与请求库进行同步调用时,我使用了不同的方法,即使用来自 fiber/future nodejs 的未来库。在请求之后我只是把“future.wait()”和异步代码回调“future.return(value)”放在里面。然后执行将等到请求完成并返回一个值。 此链接也很好地解释了该方法的使用:https://themeteorchef.com/tutorials/synchronous-methods

最好的问候,

恐龙

【讨论】:

  • 嗨迪诺,你的功夫很厉害!我试过你的建议。它就像一个魅力。非常感谢。
猜你喜欢
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 2012-11-21
相关资源
最近更新 更多