Javascript Ajax调用的Angular 1服务的竞争条件
对我来说是相当新的 因此,如果在Angular服务中使用Ajax而不是$http,我希望保留对回调函数的引用。我怀疑这个.callback变量可能存在竞争条件 当第一个会话仍在进行Ajax调用时,是否可以进入另一个会话并在this.callback上跺脚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)
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);