Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript-控制流_Javascript_Jquery - Fatal编程技术网

Javascript-控制流

Javascript-控制流,javascript,jquery,Javascript,Jquery,我需要一些关于javascript中“控制流”的最佳实践的帮助。在下面的示例中,我的updateUI函数无法正常工作,因为我的saveData函数尚未完成 function save(data){ saveData(data); updateUI(); } 为了临时解决问题,我做了这个 function save(data){ if(saveData(data)){ updateUI(); } } 更新:这是我的saveData方法 function saveData

我需要一些关于javascript中“控制流”的最佳实践的帮助。在下面的示例中,我的updateUI函数无法正常工作,因为我的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()的结果。