【发布时间】:2020-09-01 21:32:48
【问题描述】:
我有如下所示的函数,它只是向数组中的一堆端点发出请求。现在我让 Ajax 调用同步(而不是原生异步)。
这是因为虽然在异步时它确实会循环遍历 url 并正确进行调用,但我设置为变量 'name' 的 API 名称将只显示列表中的姓氏:
什么时候应该这样显示(只有当我将 Ajax 调用设置为同步时才会显示):
我很确定这是因为来自 ajax 调用的线程可能需要任何给定的时间才能完成,而 for 循环之前已经完成了它的迭代,因此列表中只有 las 名称用于显示.
如何在保持呼叫异步的同时将名称与每个呼叫的响应同步?
谢谢。
function isAlive(service) {
var buildIsAliveBox = function (isAlive, name, xhr) {
var isAliveOuterCnt = $('#isAliveOuterCont' + service);
var applyClass = isAlive ? 'alive' : 'dead';
var status = xhr.status == 0 ? 'Failed' : xhr.status;
var xhrMessage = handleHttpResponse(xhr);
var isAliveBox = $('<div class="' + applyClass + ' isAliveBox" class="btn btn-secondary" data-toggle="tooltip" data-placement="bottom" title="' + xhrMessage + '"><p class="svrName">' + name + '</br>' + status + '</p></div>');
isAliveOuterCnt.append(isAliveBox);
};
var svce = service.toLowerCase();
for (var i = 0; i < environments.qa[svce].healthUrls.length; i++) {
var data = environments[envSwitch][svce].healthUrls[i];
var name = data.split(',')[0];
var url = data.split(',')[1];
$.ajax({
url: url,
type: 'GET',
async: false,
headers: {
'Access-Control-Allow-Origin': '*',
'Content-Type': 'application/json',
},
success: function (data, status, xhr) {
buildIsAliveBox(true, name, xhr);
},
fail: function (xhr, textStatus, errorThrown) {
buildIsAliveBox(false, name, xhr);
},
error: function (xhr, status, err) {
buildIsAliveBox(false, name, xhr);
}
});
}
}
【问题讨论】:
-
效果很好,谢谢!
标签: ajax for-loop asynchronous