javascript - Ajax 调用的 Angular 1 服务的竞争条件

标签 javascript angularjs ajax race-condition

对 Angular 还很陌生...

因此,如果我在 Angular 服务中使用 Ajax(而不是 $http),我想保留对回调函数的引用。我怀疑这里的 this.callback 变量可能存在竞争条件。

当第一个 session 仍在执行 Ajax 调用时,另一个 session 是否可以介入并踩踏 this.callback

var myServer = angular.module("mymod", ["my.server"]);

myServer.service("$myservice",         

    function($server) 
    {
        var me = this;        
        this.callback = null; 

        this.saveDone = function(data)
        {
            if (me.callback) me.callback();
        }

        this.save = function(item, cb)
        {
            me.callback = cb; 

            dict = {"name" : "savePDataStory"};
            dict.item = item;        
            actions = [dict];

            $server.realAjaxCall(actions, this.saveDone, true);
        }    

最佳答案

是的。每次调用 save 都会覆盖 this.callback,因为它在 save 调用之间共享。解决方案是将回调存储在 save 本身内,每次调用该函数时该回调都是唯一的。您可以像这样内联执行此操作:

$server.realAjaxCall(actions, function (data) {
    cb();
}, true);

这保留了调用callback时不包含data的原始代码片段的行为。如果您不介意将 data 传递给 callback,您可以直接使用 cb 来简化它,而不是将其包装在函数中:

$server.realAjaxCall(actions, cb, true);

关于javascript - Ajax 调用的 Angular 1 服务的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44037199/

相关文章:

html - CSS 平铺、嵌套 div 多行居中对齐问题

javascript - 按标签重构嵌套 JSON 数据 - Javascript

javascript - 从 javascript 数组格式填充 HTML 表

angularjs - 过滤后的目录分页获取行数-angularJs

PHP、Apache、Mysql、HTML5 - 从服务器获取更改而不请求它们(推送)

html - 由于错误 c00ce56e 在所有 IE 版本中无法完成操作

javascript - XMLHttpRequest 同源策略

javascript - 如果另一个 div 宽度达到其位置,如何将类添加到元素

javascript - 使用 Google Apps 脚本解析 XML 元素中的所有值?

javascript - Atom.io 中 AngularJS 的方法完成