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

Race condition with an Angular 1 Service for an Ajax call

Angular 相当陌生...

因此,如果我在 Angular 服务中使用 Ajax(而不是 $http),我想保留对回调函数的引用。我怀疑 this.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);
        }    

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

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

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

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