アイテムがある場合はリストをループし、各アイテムの場合は外部APIをajaxコールします。ajaxループが途切れる
これはループでも個別にも呼び出すことができます。しかし、私がしたいのは、ユーザーにいつでもリクエストをキャンセルするオプションを与えることです。リストが小さい場合(約< 20)、プロセスは約2〜3秒で完了します。これは問題ありません。しかし、時にはリストが数百になることもあり、実行には数分かかることがあり、いつでもキャンセルするオプションをユーザに与えたいことがあります。
これは私が現時点で持っているものです。
<button type="button" class="btn btn-default" ng-click="getData(myList)">Get All Data</button>
<button type="button" class="btn btn-default" ng-click="cancelProcessCalls()">Get All Data</button>
<div ng-repeat="item in myList">
<div>
<div>{{item.Id}}</div>
<div>{{item.Name}}</div>
<div>
<span ng-bind-html="item.statusText"></span>
<span ng-bind="item.Data"></span>
</div>
</div>
</div>
角度/ jqueryのコードは次のとおりです。
$scope.getData = function (itemList) {
if (itemList != null) {
$.each(itemList, function (index, item) {
$scope.getItemData(item);
});
}
};
$scope.cancelProcessCalls = function() {
$scope.processCalls=false;
};
$scope.getItemData = function (item) {
if ($scope.processCalls) {
if (item != null) {
item.statusText = "Getting data...";
$.ajax({
url: _url + item.Id,
method: 'GET'
})
.fail(function (data, textStatus, jqXHR) {
$scope.handleError(data, textStatus, jqXHR);
})
.done(function (data) {
item.Data = data;
})
.then(function (data, textStatus, jqXHR) {
})
.always(function (data, textStatus, jqXHR) {
item.statusText = null;
$scope.$apply();
});
}
}
};
だから、最初の関数はリストだけをループし、各項目の呼び出しを行います。
私は、呼び出しを続行するかどうかをチェックする変数に追加しようとしましたが、すべてが作業範囲にラップされているため機能しません。
ループをエレガントにキャンセルまたは解除する簡単な方法はありますか?
最初に複数のajaxコールを実行しますか? – madalinivascu
すべてのajaxリクエストを配列の中に格納します。キャンセルがループしたときに呼び出され、[abort](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/abort)メソッドが呼び出されます。それらは – George
@ madalinivascu - ループする複数のレコードがあるためです。私はバックエンドプロセスにリストを渡してそのループを通過させることができますが、現在のところ、既存のプロセスはキャンセル能力なしで完全に正常に動作します。私はプロセス全体を再設計するつもりはなく、すぐに修正があると思っていました。 – DeclanMcD