2013-04-16 84 views
0

我有一個自定義事件,稱爲render。我的應用程序中很多鬆散耦合的組件都與它綁定,並且在事件被觸發後它們會重新呈現自己。承諾或推遲多個事件(使用自定義事件)

現在我想執行的功能後,所有的渲染都完成(僞代碼):

triggerEvent("render"); 

when(renderingComplete).then(alert("Hurray!")); 

我怎樣才能做到這一點?我需要在哪裏創建/返回延期? (另一件可能會變得棘手的問題:就我所知,函數需要返回一個deferred對象,但我的render()函數也需要返回HTML代碼才能使我的渲染系統正常工作:-S )

+0

你可以返回一個像{content:html,promise:referedObject.promise()}這樣的對象,但是被引用的對象會說什麼?渲染完成了嗎?你將無法同時返回承諾和結果,請澄清你的問題。 – cernunnos

+0

確切地說,延遲對象表示渲染已完成。這也是我認爲它可能會變得棘手的原因。 – kraftwer1

回答

0

假設你想使用異步函數(解釋爲什麼你需要延期對象)來渲染,你可以使用這樣的事情:

function render(args) { 
    var def = $.Deferred(); 

    // call async function to render, example using ajax 
    // if you could use ajax then you wouldnt need to create your own deferred 
    $.post(url,data) 
    .done(function (data) { 
     def.resolve(data); 
    }) 
    .fail(function (e) { 
     def.reject(e); 
    }); 

    // Return promise that can be used to capture success or failure of rendering 
    return def.promise(); 
} 

render().done(function (data) { 
    // data has whatever was passed in resolve(data) 
}).fail(function (e) { 
    // handle error 
}); 

最大的問題是如何實現用於異步功能呈現html。如果可以用ajax完成,那麼它會變成一個微不足道的問題,因爲jquery ajax函數返回一個延遲對象(請參閱示例中的$ .post)。

但是,如果渲染不是異步的,並且您想要的是在渲染完成後啓動事件,那麼應該可以通過添加一個新的自定義事件來在渲染函數結束時觸發生成的html作爲參數/屬性,如果您願意,可以使用「afterRender」自定義事件。