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