2013-04-16 44 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”自定义事件。