【问题标题】:Javascript - Show Spinner, Save Data Synchronously, Remove SpinnerJavascript - 显示微调器、同步保存数据、移除微调器
【发布时间】:2013-01-24 16:05:05
【问题描述】:

我正在尝试创建一个允许您连接到保存操作的 javascript 插件。我想要一些围绕逻辑的逻辑:

  1. 显示微调器
  2. 执行保存挂钩
  3. 执行保存逻辑
  4. 移除微调器

这是我的代码示例:

function save(){
    var settings = getSettings();

    showSpinner();

    // Hook-in call
    if(settings.onSave)
        settings.onSave();

    saveState();

    removeSpinner();
}

showSpinner() 只是隐藏保存/取消按钮并在其位置显示一个微调器。

hideSpinner() 则相反。

saveState() 将输入字段中的数据保存到它们的数据属性中。

settings.onSave() 可以是插件用户传递给配置的任何代码。

当我运行该过程时,即使我定义的挂钩需要大约 1.5 秒才能返回,微调器也不会出现。如果我在调试器中暂停代码,微调器确实有机会显示,并且在操作完成后它会消失。

解决此问题的最佳方法是什么?我完全不熟悉 javascript 中的异步设计模式。我知道 javascript 可以在一个线程上运行,但我不知道为什么保存操作会妨碍显示微调器。

【问题讨论】:

标签: javascript web-applications user-interface asynchronous


【解决方案1】:

在 Javascript 将控制权交还给浏览器之前,您的浏览器不会更新界面,这意味着您需要在浏览器显示微调器之前从函数返回。使用setTimeout 将控制权暂时交还给浏览器。

function save(){

    showSpinner();

    setTimeout(function(){
        var settings = getSettings();

        // Hook-in call
        if(settings.onSave)
            settings.onSave();

        saveState();

        removeSpinner();
    }, 0 );
} 

【讨论】:

  • 这行得通,感谢您的回答。但是,我明白为什么微调器 .gif 不旋转。是否有一种设计模式可以使保存调用异步,即使它不是由传入挂钩函数的用户定义的?
  • 不是,不是。根据我的经验,浏览器本身应该是多线程的,足以在执行 javascript 时旋转 .gif。在这种情况下,您的 settings.onSave() 究竟做了什么?
  • 无论用户定义什么。就我而言,它对我的​​ Web 服务进行同步调用,以将一些数据保存到我的数据库中。它是同步的原因是因为我想在挂钩之后运行操作,而我永远无法提前知道除了我自己之外的用户会定义什么作为挂钩函数。
  • 问题是,如果您将全部控制权交给用户(例如让他们编写保存功能),那么您对他们如何行使该控制权就无能为力了。 Javascript 不包含强制重绘的方法,也不包含修改他人代码的可靠、实用的方法。哦,事实证明我错了——你不能在 JS 执行时为 gif 设置动画。为什么?我不知道。看起来很傻。
  • 我将尝试在why-does-my-spinner-gif-stop-while-jquery-ajax-call-is-running 找到的另一件事。如果有帮助,我会告诉你的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多