2013-05-19 27 views
6

我想根據Flickr API調用生成Flickr url,然後將該結果返回給handlebars.js模板。我正在努力尋找解決異步進程的方法。流星 - 將異步函數返回給handlebar模板?

我試圖創建一個回調函數,但我仍然不確定如何獲取定義的對象或變量到HTML模板中。

這裏是Flickr的API函數的代碼:

var FlickrRandomPhotoFromSet = function(setID,callback){ 
Meteor.http.call("GET","http://api.flickr.com/services/rest/?method=flickr.photosets.getPhotos&api_key="+apiKey+"&photoset_id="+setID+"&format=json&nojsoncallback=1",function (error, result) { 
    if (result.statusCode === 200) 
    var photoResult = JSON.parse(result.content); 
    var photoCount = photoResult.photoset.total; 
    var randomPhoto = Math.floor((Math.random()*photoCount)+1); 
    var selectedPhoto = photoResult.photoset.photo[randomPhoto]; 
    var imageURL = "<img src=http://farm"+selectedPhoto.farm+".staticflickr.com/"+selectedPhoto.server+"/"+selectedPhoto.id+"_"+selectedPhoto.secret+"_b.jpg/>"; 
    FlickrObject.random = imageURL; 
    } 
    if (callback && typeof(callback)==="function") { 
     callback(); 
    } 
});}; 

我的模板代碼是這樣的:

Template.backgroundImage.background = function(){ 
    FlickrRandomPhotoFromSet(setID,function(){ 
     return FlickrObject; 
    }); 
}; 

但是,這仍然讓我卡住,沒能獲得一個定義的對象爲我HTML,其被編碼爲這樣:

<template name="backgroundImage"> 
<div id="background"> 
    {{random}} 
</div> 

回答

10

使用Session作爲中介。這是反應,以儘快它集它會改變模板,以新的數據:

Template.backgroundImage.background = function(){ 
    return Session.get("FlickrObject"); 
}; 

Template.backgroundImage.created = function() { 
    FlickrRandomPhotoFromSet(setID,function(){ 
     Session.set("FlickrObject", FlickrObject) 
    }); 
} 

所以在創建模板時運行FlickrRandomPhotoFromSetcreated方法將運行,當返回結果是它將設置會話哈希會在收到結果後立即設置背景。

請注意您的FlickrRandomPhotoFromSet,我沒有注意到你有一個參數FlickrObject傳遞給回調。

+0

感謝您的幫助。我已經決定消除Flickr對象(這純粹是試圖從函數中獲取變量),並且我已經將該url直接從函數內部傳遞給Session對象。 Template.backgroundImage.background模板腳本現在返回Session.get。現在一切都按預期工作,除了URL是用重複的引號返回的,我還沒有想出如何消除這個...! – shongololo

+1

當你設置會話哈希時,你可以使用'/「([^」] +)「/ i.exec(FlickrObject)[1]'而不是'FlickrObject'。我使用了'FlickrObject',但是你可以重命名它無論你擁有什麼,表達式都是一個正則表達式,可以去掉封裝的雙引號 – Akshat