【问题标题】:Race condition with an Angular 1 Service for an Ajax call使用 Angular 1 服务进行 Ajax 调用的竞争条件
【发布时间】:2017-05-18 01:35:11
【问题描述】:

对 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);
        }    

【问题讨论】:

    标签: javascript angularjs ajax race-condition


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      相关资源
      最近更新 更多