Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在meteor helpers中发出ajax请求_Javascript_Ajax_Meteor - Fatal编程技术网

Javascript 在meteor helpers中发出ajax请求

Javascript 在meteor helpers中发出ajax请求,javascript,ajax,meteor,Javascript,Ajax,Meteor,在将数据返回给meteor helpers方法时,如何等待ajax请求完成 比如说, Template.item.helpers({ itemName:function () { var user = Meteor.user(); $.when(reallyLongAjaxRequest()).done(function (a1) { //tried using jquery when

在将数据返回给meteor helpers方法时,如何等待ajax请求完成

比如说,

Template.item.helpers({

        itemName:function () {
            var user = Meteor.user();

            $.when(reallyLongAjaxRequest()).done(function (a1) {
               //tried using jquery when
                return "Item Name should have this because it waited";
            });

            return " Doesnt wait at all";
        }
    });
我正在运行一个
reallyLongAjaxRequest()
,我希望它在继续使用itemName助手之前完成。控制台的log语句始终显示undefined,但这是因为ajax请求尚未完成。我在运气不佳时尝试使用jquery。有什么想法吗

编辑:


我应该提到,我在helper函数中是有原因的。我需要呈现项“id”,以便可以使用该参数运行ajax请求。使用反应式会话将是完美的,但我不知道有什么方法可以获取helpers方法定义之外的当前呈现项?

单独发出ajax请求,并在请求完成后将结果存储在会话变量中。然后让模板助手返回会话变量的值。大概

$.get(url, function (data) {
  Session.set('result', data);
});

Template.item.itemName = function () {
  return Session.get('result');
};

会话是一个反应式数据源,因此当ajax调用的结果出现时,模板将自动更新。(当然,您可以随意选择调用会话变量,我只是以“result”为例)。

未命名的集合是一个将
null
作为名称传递的集合。它是内存中的数据结构,不保存到数据库中。()

好的,给定一个名为“items”的Meteor集合,并希望根据item _id为每个item执行ajax请求,然后能够在模板中引用ajax结果,我将这样做:

(大致)

在html中,您需要将id传递给助手:

{{itemName _id}}
在定义helper时,没有办法只超时几秒钟,这样我的ajax请求就可以在不立即返回的情况下完成


不,对于反应式编程,事情会立即发生,但当你有了新东西时就会更新。

这是可行的,并在MeteorJS>1.3.x中进行了测试

从控制台添加http包
meteor添加http

示例POST调用,数据元素被发送到服务器并带有自定义头

HTTP.call('POST', tokenUri, {
    data: {
        "type": 'authorization_code',
        //"client_id": clientId,
        "code": code,
        "redirect_uri" : redirectUri,

    },
    headers: {
        "Access-Control-Allow-Origin" : "*",
        "Access-Control-Allow-Credentials" : "true",
        "Access-Control-Allow-Methods" : "GET,HEAD,OPTIONS,POST,PUT",
        "Access-Control-Allow-Headers" : "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers",
    }
},function(error, response) {
    if ( error ) {
        console.log( error );
    } else {
        console.log( response );
    }
});

你必须划分你的函数。一部分在请求之前,另一部分在请求之后。在XMLHttpObject上,您可以处理“不确定我是否了解”问题。这是否与使用$.when方法结合使用?我不知道Meteor Api,所以我建议使用裸XMLHTTP请求解决问题。我可能大错特错了。ajax请求使用item\u id作为参数来发出ajax请求。当我显示我的项目时,我获取每个项目id,从中获取数据,并向数据源发出ajax请求以获取更多数据。如何在不进入项目内部的情况下为每个项目发出ajax请求以获取此字段。\u id?项目来自何处?如果它们来自一个集合,那么我要做的就是向集合中添加一个
observe
,当添加一个项目时,我会在此时发出ajax请求。更棘手的是将特定项的结果放入项的模板中。一种简单但有点不雅观的方法是将结果存储在一个名为“result_”的会话变量中,该变量与id连接在一起。实际上,我可能会使用一个未命名的集合来保存项目结果。您能解释一下未命名的集合来保存项目结果是什么意思吗?我使用meteor集合“item”来保存所有项目,并执行标准#每次迭代来显示项目。在定义helper时,没有办法只超时几秒钟,这样我的ajax请求就可以在不立即返回的情况下完成。任何类型的流星回拨,我可以附加到后的事实,使我仍然有权访问每个单独的项目不介意。再次感谢你帮助我跳出框框思考。此外,id不必位于帮助器中。你可以用这个来检索id。\ id在助手定义中,我还必须在meteor中移动observe changes调用。startup由于我定义集合的方式,meteor找不到“Items”和“Results”,我不想回到这里,但因为这是一个内存中的数据结构,当我停止并启动meteor时。Results中的result属性不存在,我必须手动刷新以获取该数据。流星中有什么我可以马上跑的吗?
HTTP.call('POST', tokenUri, {
    data: {
        "type": 'authorization_code',
        //"client_id": clientId,
        "code": code,
        "redirect_uri" : redirectUri,

    },
    headers: {
        "Access-Control-Allow-Origin" : "*",
        "Access-Control-Allow-Credentials" : "true",
        "Access-Control-Allow-Methods" : "GET,HEAD,OPTIONS,POST,PUT",
        "Access-Control-Allow-Headers" : "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers",
    }
},function(error, response) {
    if ( error ) {
        console.log( error );
    } else {
        console.log( response );
    }
});