Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何处理javascript中的异步问题_Javascript_Jquery - Fatal编程技术网

如何处理javascript中的异步问题

如何处理javascript中的异步问题,javascript,jquery,Javascript,Jquery,我想显示存储在ch中的数据!但我的问题是,ch在数据存储之前显示! 我认为这是一个异步问题!我怎样才能解决这个问题。 当我试图得到ch的长度时,我总是得到0。即使我将数据静态存储在ch中,我也会得到长度0。 我认为这是一个异步问题!我怎样才能解决这个问题 函数recherchefilterée{ var nom = document.getElementById('nompre').value; var matricule = document.getElementById('matcle').

我想显示存储在ch中的数据!但我的问题是,ch在数据存储之前显示! 我认为这是一个异步问题!我怎样才能解决这个问题。 当我试图得到ch的长度时,我总是得到0。即使我将数据静态存储在ch中,我也会得到长度0。 我认为这是一个异步问题!我怎样才能解决这个问题

函数recherchefilterée{

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后返回。这就是承诺的工作方式。