javascript - 如何取消javascript中的异步进程?

标签 javascript jquery asynchronous

我有一个单窗口 javascript 应用程序。我有一个仪表板,它通过在后台通过多个获取请求加载来显示某些图像。

当并非所有 get 请求都按时完成并且网站上下文发生变化时就会出现问题,因为那时我想清除仪表板。然而,如果获取请求尚未完成,他们将使用错误的图像填充仪表板。

我正在想办法中止那些获取请求。有人可以指导我正确的方向吗?

var Dashboard = {
    showAllAssets: function(){
        var self = this;
        this.resetDashboard();

        $.get(this.urlForAllAssets, function(json){
           self.loadAssets(json);
        });

    },
    showAssetsForCategory: function(categoryId) {
        ...

    },
    getHtmlForAsset: function(id) {
        var self = this;
        $.get(this.urlForDashboardThumb + "/" + id.toString(), function(assetHtml){
            var $asset = $(assetHtml);
            self.insertAssetThumbIntoDom($asset);
            // this gets inserted even when context changed, how can I prevent that?
            var thumb = Object.create(Thumbnail);
            thumb.init($asset);
        }, 'html')
    },
    insertAssetThumbIntoDom: function($asset) {
        $asset.appendTo(this.$el);
    },
    resetDashboard: function() {
        this.$el.html("");
    },
    loadAssets: function(idList) {
        var self = this;
        var time = 200;

        // These get requests will pile up in the background

        $.each(idList, function(){
            var asset = this;
            setTimeout(function(){
                self.getHtmlForAsset(asset.id);
            }, time);
            time += 200;
        });
    },
    bind: function() {
        $document.on('loadAssets', function(event, idList) {
            self.loadAssets(idList);
        });

        $document.on('switched_to_category', function(event, categoryId) {
            self.showAssetsForCategory(categoryId);
        });

        $document.on('show_all_assets', function(){
            self.showAllAssets();
        })
    },
    init: function($el) {
        this.$el = $el;
        this.resetDashboard();
        this.bind();
    }
}

最佳答案

虽然您无法停止已发送的请求,但您仍然可以解决您的问题。

我的解决方案是生成一个简单的 ID,例如一组随机数字,并将其存储在仪表板中的某个位置,将其与请求一起发送,然后将其与图像一起发回。

如果生成了一个新的上下文,它将有一个新的 ID。

如果图像返回的 ID 与当前上下文中的 ID 不同,则丢弃它。

关于javascript - 如何取消javascript中的异步进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21464295/

相关文章:

javascript - 如何将节点从一个列 div 拖到另一列 div

javascript - 免点调试

jquery - iPhone iOS7 3D 选择/下拉功能

javascript - 如何重新排序异步函数的执行顺序?

c# - 在签名中包含异步(在正文中没有等待)对程序流程有什么影响?

javascript - 为什么这个小书签代码说 jQuery 没有定义,即使包含了 jQuery?

javascript - 如何编写通过选择器切换类的 Angular Directive(指令)

jQuery - 替换特定单词之前的 HTML 内容

jquery - 如何使用 jQuery 中的 Enter 键切换表单元素

javascript - 在异步函数中设置和访问全局对象