Javascript-控制流
我需要一些关于javascript中“控制流”的最佳实践的帮助。在下面的示例中,我的updateUI函数无法正常工作,因为我的saveData函数尚未完成Javascript-控制流,javascript,jquery,Javascript,Jquery,我需要一些关于javascript中“控制流”的最佳实践的帮助。在下面的示例中,我的updateUI函数无法正常工作,因为我的saveData函数尚未完成 function save(data){ saveData(data); updateUI(); } 为了临时解决问题,我做了这个 function save(data){ if(saveData(data)){ updateUI(); } } 更新:这是我的saveData方法 function saveData
function save(data){
saveData(data);
updateUI();
}
为了临时解决问题,我做了这个
function save(data){
if(saveData(data)){
updateUI();
}
}
更新:这是我的saveData方法
function saveData(data){
$.ajax({
url: url, // a variable, not important for this example
data: data,
type: "post",
dataType: "json",
success: function(data) { return true; },
error: function(e) {
console.log(e);
}
})
我觉得我应该学习“标准”方法,如果存在的话。这是因为您的saveData是一种a同步方法。您需要在oncomplete事件中调用updateUI()
看一看并仔细阅读有几种方法可以做到这一点 您可以为saveData方法提供一个回调函数,在saveData完成时调用该方法
var saveData = function(data, cb){
// do something with data to save it
cb.apply(this, ['arguments', 'as', 'an','array']); // or use .call instead
}
您可以实现一些事件,以便updateUI方法侦听事件,当事件发生时,它会导致updateUI运行,当您完成保存数据时,您会触发该事件。jQuery提供了一个主干网
有很多方法可以实现这一点——选择最适合您的方法。假设
saveData
正在调用AJAX函数(例如$。AJAX
),让它返回该AJAX函数的结果:
function saveData() {
return $.ajax({
url: url, // a variable, not important for this example
data: data,
type: "post",
dataType: "json"
}).fail(function(e) {
console.log(e);
});
}
然后使用jQuery延迟链接更新UI:
saveData().done(updateUI).fail(showError);
它允许您避免将回调函数传递到saveData
调用中,从而允许您将数据保存逻辑与UI逻辑完全分离
编辑我已更新了代码,以显示如何使用延迟对象包含默认的
失败
处理程序,但仍然返回承诺
,以便您可以在外部处理UI更新。saveData在做什么?如果updateUI尚未完成,它将如何执行?它是否异步执行任何操作?我不明白为什么将它包装在if
语句中会有所不同。是的,saveData是一个ajax调用,用于将一些数据发布到数据库。我不想把updateUI方法放在ajax调用的成功处理程序中,因为它实际上不属于那里。saveData
不一定有oncomplete
事件,除非他们在提供该事件的框架上构建了saveData
。谢谢。如上所述,我在saveData()中使用.ajax,我们当然可以将updateUI调用放在.ajax的成功处理程序中。然而,从关注点分离的角度来看,我认为saveData不需要知道更新UI的相关信息。它应该保存数据,并且只保存数据。在某些情况下,我需要调用它,并且不需要更新UI。您可以将其作为承诺来实现。由于除了标记之外没有对jQuery的引用,我不想假设oncomplete
在其saveData
函数中可用。谢谢。我在saveData()方法中使用.ajax,它确实提供了一个成功的处理程序。我只是觉得我的saveData方法应该做一件事,不必担心更新UI,因为每次我保存数据时,我都不需要重新加载UI,只有在某些情况下。因此,我试图在上面显示的save()方法中协调这一点。@JasonWells当前正确的方法是使用延迟对象和.done
,根据我的回答。@JasonWells在这种情况下,您只需将回调函数传递给$.ajax
调用中的success
选项即可。@tkone将回调传递给$.ajax
就是如此;-)@当然是。但它也很直截了当,很容易理解。我发现有些人在弄清楚$.deferred
如何工作以及如何将.done
链接到方法调用时遇到问题。Alnitak,这实际上是一个非常优雅的解决方案,也是我一直在寻找的。谢谢我确实在使用.ajax。不过,我可能有点不知道如何正确返回。现在我得到一个布尔值“true”被返回。@JasonWells这个布尔值意味着什么?异步方法通常不能“返回”任何东西(除了一个承诺
以后返回的东西…),我在ajax请求的成功处理程序中有一个返回true。例如,success:function(data){return true;},error:function(E){console.log(E)}@JasonWells,return true
将永远不会被计算-异步方法不会将其值返回给调用方。只有AJAX成功,才会调用.done
方法。您可以使用.fail
注册错误处理程序。@JasonWells查看我的更新答案-它需要返回$.ajax()的结果。