2010-05-29 53 views
2

有一个问题,我似乎无法环绕我的头。我想写一个通用的JavaScript函数,它将接受一个变量和一个回调,并继续执行,直到该变量不是false。Javascript回调时变量设置为X

例如,变量SpeedFeed.user.sid是false,直到代码中发生其他事情,但我不想执行特定的回调,直到它已被设置。

召唤:

SpeedFeed.helper_ready(SpeedFeed.user.sid, function(){ 
    alert(SpeedFeed.user.sid); 
    // Run function that requires sid to be set. 
}); 

功能:

helper_ready: function(vtrue, callback){ 
    if(vtrue != false){ 
    callback(); 
    } else { 
    setTimeout(function(){ 
     SpeedFeed.helper_ready(vtrue, callback); 
    }, SpeedFeed.apiCheckTime); 
    } 
} 

我已经收窄到这个问题似乎是,因为在我的setTimeout调用vtrue而不是实际的SpeedFeed。 user.sid,它会一直设置为false。我意识到我可以为每次评估SpeedFeed.user.sid时编写一个特定的函数,但是我想要一个可以在整个应用程序中使用的通用方法。

感谢任何见解:)

+0

SpeedFeed.user.sid是一个函数吗?我认为这是因为你写了*“我打电话给vtrue,而不是实际的SpeedFeed.user.sid”*。因为你叫它,我认为它是一个函数。我错了吗? – user113716 2010-05-29 19:57:57

回答

0

通行证helper_ready三个参数: source_object的,object`s_property,回调

,然后检查object`s财产的状况。你的情况 这将是

SpeedFeed.helper_ready(SpeedFeed.user, "sid", function(){ 
    alert(SpeedFeed.user.sid); 
    // Run function that requires sid to be set. 
}); 

全球财产:

SpeedFeed.helper_ready(window, "sid", function(){ 
    alert(windwo.sid); 
    // Run function that requires sid to be set. 
}); 
1

您传递的vtrue当前值setTimeout其重复进行处理,因此参数vtrue始终是相同的( vtrue是不可变的)。

而不是写一个回调函数一样,检查,当特定值是true的,为什么不能让setter和getter函数可以调用callback()或只是调用callback()直接每当vtruetrue?代码将更容易遵循这种方式,你不需要像循环的setTimeout黑客。

这个问题有多种解决方案,不需要回调。一种常规方法是使用setters and getters而不是分配。

1

除了@Trey的回答,因为我也在考虑settergetter。除了设置和获取功能之外,我还会建议添加诸如registerListenerunregisterListener之类的内容,它将注册侦听器来跟踪变量的状态。然后每次getter被调用遍历所有的监听器,并告诉他们更新的值,或者只是将这个值传递给它们。