2

我需要一些关于 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);
    }
})

如果存在这种方法,我觉得我应该学习“标准”方法。

4

3 回答 3

3

假设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 逻辑完全分离。

编辑 我已经更新了代码,以展示如何包含一个默认fail处理程序,也使用延迟对象,但仍然返回,promise以便您可以在外部处理 UI 更新。

于 2012-07-19T21:12:27.170 回答
0

这是因为您的 saveData 是异步方法。您需要在 oncomplete 事件中调用 updateUI()。

看看这篇文章并阅读promise()

于 2012-07-19T21:08:57.137 回答
0

有几种方法可以做到这一点。

您可以为 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 运行,当您完成 saveData 时会触发该事件。jQuery 提供了一个,以及 Backbone。

有很多方法可以完成这项工作——选择最适合您的方法。

于 2012-07-19T21:09:40.050 回答