2013-04-17 70 views
6

如何等待ajax請求完成時纔將數據返回給流星幫助程序方法。在流星幫助程序中發出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之前完成。日誌語句到控制檯始終顯示未定義,但這是因爲ajax請求尚未完成。我嘗試使用jquery時,沒有運氣。任何想法

編輯:

我要指出,我是有原因的輔助函數裏面。我需要渲染項目'id',以便我可以使用該參數運行ajax請求。使用反應會話將是完美的,但我不知道一種方法來獲取當前呈現項目的助手方法定義之外?

+0

您必須劃分你的功能。一部分在請求之前,另一部分在之後。在XMLHttpObject上,你可以處理[events](http://www.w3.org/TR/XMLHttpRequest/#events) –

+0

不確定我是否關注你。這是否與使用$ .when方法一起使用? – Warz

+0

我不知道流星Api,所以我建議使用裸XMLHTTP請求的解決方法。我可能是非常錯誤的。 –

回答

5

一個未命名的集合是其中null傳遞的名稱。它是內存中的數據結構,不保存到數據庫中。 (http://docs.meteor.com/#meteor_collection

好吧,給定一個名爲「items」的Meteor集合,並且希望根據item _id爲每個項目做一個ajax請求,然後能夠在模板中引用ajax結果,這就是我倒是做:

(大約)

var Items = new Meteor.Collection('items'); 
var Results = new Meteor.Collection(null); 

Items.find().observeChanges({ 
    added: function (id) { 
    $.get(url, {id: id}, function (data) { 
     if (Results.findOne(id)) 
     Results.update(id, {$set: {result: data}}); 
     else 
     Results.insert({_id: id, result: data}); 
    }); 
    } 
}); 

Template.item.itemName = function (id) { 
    var doc = Results.findOne(id); 
    if (doc) 
    return doc.result; 
    else 
    return ""; 
}; 

HTML中你需要在ID傳遞給幫手:

{{itemName _id}} 

當定義助手時,是否沒有辦法超時幾秒,以便我的ajax請求完成而不立即返回。

不,與反應性編程的事情立即發生,但你更新時,當你有新的東西。

+0

沒關係。再次感謝幫助我在盒子外面思考。此外,該ID不必在助手中。你可以在幫助器定義中使用this._id來檢索id,因爲我定義我的集合的方式,我還必須在meteor.startup中移動觀察更改調用,流星找不到'Items'&'Results' – Warz

+0

我討厭回到這裏,但因爲這是一個內存數據結構,當我停下來並開始流星。結果中的結果屬性不存在,我必須手動刷新以獲取該數據。流星中的任何東西都可以立即運行? – Warz

1

單獨製作您的ajax請求,並在完成後,將結果存儲在Session變量中。然後讓你的模板助手返回Session變量的值。大約...

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

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

會議是一種反應性的數據源,所以你的模板將自動更新當Ajax調用的結果用武之地。(當然,你可以選擇呼叫會話變量任何你喜歡的,我只是用「結果」作爲例子)。

+0

ajax請求使用項目_id作爲參數來發出ajax請求。當我顯示我的項目時,我抓取每個項目ID,從中獲取數據並向數據源發出ajax請求以獲取更多數據。我怎樣才能讓每個項目做一個Ajax請求,而不是在項目內部獲得this._id字段? – Warz

+0

物品來自哪裏?如果他們來自一個集合,那麼我會做的是添加一個「觀察」集合,當一個項目被添加時,我會在那個時候發出ajax請求。 稍微複雜一點就是將特定項目的結果放入項目的模板中。一個簡單但不雅的方法是將結果存儲在一個名爲「result_」的會話變量中,並與該id相連接。 –

+0

好吧,實際上,我可能會使用未命名的集合來保存項目結果。 –

-1

這工作和在MeteorJS測試>的1.3.x

從控制檯meteor add http

例POST調用與數據元素被髮送到服務器,並使用自定義首部添加HTTP包。

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