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

Javascript Ajax调用的Angular 1服务的竞争条件,javascript,angularjs,ajax,race-condition,Javascript,Angularjs,Ajax,Race Condition,对我来说是相当新的 因此,如果在Angular服务中使用Ajax而不是$http,我希望保留对回调函数的引用。我怀疑这个.callback变量可能存在竞争条件 当第一个会话仍在进行Ajax调用时,是否可以进入另一个会话并在this.callback上跺脚 var myServer = angular.module("mymod", ["my.server"]); myServer.service("$myservice", function($server)

对我来说是相当新的

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

当第一个会话仍在进行Ajax调用时,是否可以进入另一个会话并在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);
        }    
对。每次要保存的调用都将覆盖此.callback,因为它在要保存的调用之间共享。解决方案是将回调存储在save本身中,每次调用函数时,它都是唯一的。您可以这样做:

$server.realAjaxCall(actions, function (data) {
    cb();
}, true);
这将保留调用回调时不包含数据的原始代码段的行为。如果您不介意将数据传递给回调函数,可以直接使用cb来简化它,而不是将其包装在函数中:

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