正确使用回调?

时间:2013-02-08 21:32:10

标签: meteor

我正在学习meteor编写一个简单的应用程序来从一个集合中提取信息(一组,并根据从该集合返回的内容(一个项目,名称和项目ID的大列表),在一个集合中查找项目名称的不同集合。我的想法是项目集合只在服务器上发布,因为它很大,客户端不需要直接访问它。

一切都或多或少有效,除了我认为我没有正确处理回调。这是我写的简单测试。我传递项目名称的模板:

Template.operations.getTypeID = function(name) {
  result = "";
  console.log("Precall Logging name: ", name);
  console.log("Precall Logging result: ", result);

  result = Meteor.call('getID', name, function (error, result) {
    console.log("Async Logging in call: result: ", result);
  });

  console.log("Name is now", name);
  console.log("Result is now", result);

  return name;
}

这是服务器上的方法,我最终会根据名称查找ID:

Meteor.methods({ 

        getID: function(itemName) {
            result = itemName + "_changed";
            console.log("server: getID result:", result);

            return result;
         }

});

这是我在HTML文件中调用模板的地方:

<td>{{getTypeID name}}</td>

当我使用应用程序时,我可以看到方法getID以异步方式调用 - getID方法中的结果发生更改,并在模板中的其他条目之后写入控制台。如何设置回调中返回的结果在模板中可用并返回到客户端,以便我可以在页面中呈现它?

更新:在进行一些修改后,这是我的console.log输出:

Precall Logging name:  Apples lootlog.js:79
Precall Logging result:   lootlog.js:80
Name is now Apples lootlog.js:86
Result is now undefined lootlog.js:87
Precall Logging name:  Oranges lootlog.js:79
Precall Logging result:   lootlog.js:80
Name is now Oranges lootlog.js:86
Result is now undefined lootlog.js:87
Precall Logging name:  Melons lootlog.js:79
Precall Logging result:   lootlog.js:80
Name is now Melons lootlog.js:86
Result is now undefined lootlog.js:87
Precall Logging name:  Grapes lootlog.js:79
Precall Logging result:   lootlog.js:80
Name is now Grapes lootlog.js:86
Result is now undefined lootlog.js:87
Precall Logging name:  Onion lootlog.js:79
Precall Logging result:   lootlog.js:80
Name is now Onion lootlog.js:86
Result is now undefined lootlog.js:87
Async Logging in call: result:  Apples_changed lootlog.js:83
Async Logging in call: result:  Oranges_changed lootlog.js:83
Async Logging in call: result:  Melons_changed lootlog.js:83
Async Logging in call: result:  Grapes_changed lootlog.js:83
Async Logging in call: result:  Onion_changed 

这是打印到流星控制台的内容:

server: getID Name: Apples
server: getID result: Apples_changed
server: getID Name: Oranges
server: getID result: Oranges_changed
server: getID Name: Melons
server: getID result: Melons_changed
server: getID Name: Grapes
server: getID result: Grapes_changed
server: getID Name: Onion
server: getID result: Onion_changed

2 个答案:

答案 0 :(得分:0)

您是否尝试将变量分配给Meteor.call调用getID的返回值?看起来你想要变量'name'来改变,所以做'name = Meteor.call ...'应该照顾它。

答案 1 :(得分:0)

我不建议使用范例将数据传输到模板,因为每个项目都是循环的,你正在向服务器发送Meteor.call,这在更高延迟的环境中确实会降低速度。

模板帮助器里面有一个Meteor.call,它不能在客户端同步运行,所以你必须将结果传递给一个反应变量,例如Session,然后将它们传递给模板

我建议您拨打一个电话而不是许多小电话,在下面的代码中,我使用了一个带有一系列名字的电话。

服务器

Meteor.methods({ 
        //Input variable is an array of names
        getID: function(itemNameArray) {
            result = {};  //Initialize an empty array

            itemNameArray.forEach(function(entry) {
                itemNameArray[entry] = entry + "_changed";
            });
            return result;
         }
});

客户端

Template.operations.getTypeID = function(name) {
    Session.get("variables")[name];
}

Meteor.call('getID', ["Apples", "Oranges", "Grapes", "Onions"], function (error, result) {
    Session.set("variables", result);
});

同样,我不确定你想要做什么,但你可以用你从哪里获得名字的数据源替换数组。

Session.set/getreactive所以只要Meteor从服务器获取数据,它就会相应地更新模板