如何处理javascript中的异步问题
我想显示存储在ch中的数据!但我的问题是,ch在数据存储之前显示! 我认为这是一个异步问题!我怎样才能解决这个问题。 当我试图得到ch的长度时,我总是得到0。即使我将数据静态存储在ch中,我也会得到长度0。 我认为这是一个异步问题!我怎样才能解决这个问题 函数recherchefilterée{如何处理javascript中的异步问题,javascript,jquery,Javascript,Jquery,我想显示存储在ch中的数据!但我的问题是,ch在数据存储之前显示! 我认为这是一个异步问题!我怎样才能解决这个问题。 当我试图得到ch的长度时,我总是得到0。即使我将数据静态存储在ch中,我也会得到长度0。 我认为这是一个异步问题!我怎样才能解决这个问题 函数recherchefilterée{ var nom = document.getElementById('nompre').value; var matricule = document.getElementById('matcle').
var nom = document.getElementById('nompre').value;
var matricule = document.getElementById('matcle').value;
$.ajax({
url: "myWebServiceURL",
type: "GET",
dataType: "xml",
success: function(xml) {
var stock = [];
$(xml).find('Population').each(function() {
var table = document.getElementById("myTable");
$(this).find("directories").each(function()
{
dossier = $(this).attr('dossier');
stock.push(dossier);
});
});
var ch = [];
for (var i = 0; i < stock.length; i++) {
$.ajax({
url: "/mySecondWebServiceURL" + stock[i],
type: "GET",
dataType: "xml",
success: function(xml) {
var NMPRES = "";
var jsonObj = JSON.parse(xml2json(xml, ""));
var nom = jsonObj.SubmitResponse.occurrences.occurrence.filter(x => x["@datasection"] === "TS")[0].data.filter(x => x.item === "NMPRES")[0].value;
var matcle = jsonObj.SubmitResponse.occurrences.occurrence.filter(function(x) {
return x["@datasection"] === "LM"
})[0].data.filter(x => x.item === "MATCLE")[0].value;
var dossier = jsonObj.SubmitResponse.occurrences.occurrence.filter(function(x) {
return x["@datasection"] === "LM"
})[0]["@dossier"];
ch.push({
"nom": nom,
"matcle": matcle,
"dossier": dossier
});
if ($('#population').val() != null && firstIter == false) {
}
},
error: function(request, error) {
console.log('error Connexion : ' + error + ' request Connexion : ' + request);
}
});
}
var txt = "";
var firstIter = true;
for (var key in ch) {
if (ch[key].matcle === matricule) {
txt += "<option value='" + ch[key].dossier + "'" + firstSelect(firstIter) + ">" + ch[key].nom + "</option>";
firstIter = false;
}
}
$('#population').html(txt)
},
error: function(request, error) {
console.log('error Connexion : ' + error + ' request Connexion : ' + request);
}
});
}
问题是您没有等待第二个服务响应。 应该是这样的:
const deferreds = stock.map((stockItem) => {
//... your logic with ch.push here
return $.ajax({
// your call to the second service
});
});
$.when(...deferreds).then(() => {
// your code
// for (var key in ch) {
});
我更愿意采用的方法是分解代码并使用承诺。你真的应该花时间学习承诺。这是一个JavaScript标准,是jQuery在幕后使用的
function RechercheFiltrée() {
var nom = document.getElementById('nompre').value;
var matricule = document.getElementById('matcle').value;
return $.ajax({
url: "myWebServiceURL",
type: "GET",
dataType: "xml"
});
}
function getStockArray(xml) {
var stocks = [];
$(xml).find('Population').each(function() {
var table = document.getElementById("myTable");
$(this).find("directories").each(function() {
{
dossier = $(this).attr('dossier');
stocks.push(dossier);
});
});
});
return stocks;
}
function getStocks(stocks) {
return Promise.all(stocks.map(fetchStock));
}
function fetchStock (stock) {
return $.ajax({
url: "/mySecondWebServiceURL" + stock,
type: "GET",
dataType: "xml"
})
.then(formatStockInfo)
}
function formatStockInfo (xml) {
var NMPRES = "";
var jsonObj = JSON.parse(xml2json(xml, ""));
var nom = jsonObj.SubmitResponse.occurrences.occurrence.filter(x => x["@datasection"] === "TS")[0].data.filter(x => x.item === "NMPRES")[0].value;
var matcle = jsonObj.SubmitResponse.occurrences.occurrence.filter(function(x) {
return x["@datasection"] === "LM"
})[0].data.filter(x => x.item === "MATCLE")[0].value;
var dossier = jsonObj.SubmitResponse.occurrences.occurrence.filter(function(x) {
return x["@datasection"] === "LM"
})[0]["@dossier"];
if ($('#population').val() != null && firstIter == false) {
}
return {
"nom": nom,
"matcle": matcle,
"dossier": dossier
};
}
function updateSelectMenu (ch) {
var txt = "";
var firstIter = true;
for (var key in ch) {
if (ch[key].matcle === matricule) {
txt += "<option value='" + ch[key].dossier + "'" + firstSelect(firstIter) + ">" + ch[key].nom + "</option>";
firstIter = false;
}
}
$('#population').html(txt)
}
RechercheFiltrée()
.then(getStockArray)
.then(getStocks)
.done(updateSelectMenu);
你的代码中有一些错误,比如额外的逗号和花括号。首先检查你的语法,确保它不是一个简单的语法错误。在这些语法错误中,有一个特别突出…但我不确定它是否真的是…请注意:e处黑色和蓝色的不同颜色。为了安全起见,尝试使用ee instead、 @LambdaNinja我已经编辑过了!这与我的意思不完全一样,因为编辑器的格式不是问题所在,而是一个标识符有一个我以前从未见过的重音字符,这让我停下来思考……如果有一个字符在击键时不可用,那么这个字符对于标识符来说是否合理。换句话说,如果另一个程序员必须处理该代码并且不会说法语。那个不幸的程序员需要剪切和粘贴或使用组合键吗?请使用该标识符?Thnx作为您的答复,但我仍然遇到同样的问题!此代码在formatStockInfo之前调用updateSelectMenu!因此它在未定义的内容中循环ch:/updateSelectMenu将仅在getStocks返回后运行,getStocks将仅在数组中的每个股票都运行了fetchStock和formatStockInfo后返回。这就是承诺的工作方式。