在 javascript 中首先显示加载的元素

Show the loaded element first in javascript

我想知道如何先使用 javascript 对加载的东西进行排序。

如图所示,我有一个元素数组,这些元素正在传递给一个函数并进行 ajax 调用,直到它完成成功数据,我正在显示一个加载程序 (.gif)。 我想先显示加载的元素,如果加载元素在顶部,总是移动到堆栈的最后,

所以我有一个元素 undefined,一旦加载完成,转向 1 知道它已加载,但它不起作用,我想知道在 javascript

var elements=["trans", "fund", "service"];
setTimeout(()=>{elements.map(e=>this.getData(e));}, 1000);

function getData(id){
    var loader = this.shadowRoot.getElementById("overlay-"+id);
    $(loader).css("display", "block");
        $.ajax({
      url: url,
      method: 'get',
      global: false,
      async: true,
      dataType: "json",
      data: {
         element: id
      },
      success: function (data) {
        self.getNewData(data);  
      },
      complete: function(){
        $(loader).css("display", "none");
       },
    }).responseText;
}

//success data will be like below

data=[{
 "id": "trans",
 "load": "undefined",
 "option": "bank",
 "cost": "100"
},{
  "id": "fund",
 "load": "undefined",
 "option": "credit",
"cost": "300"
},{
 "id": "service",
 "load": "undefined",
 "option": "bank",
 "cost": 200"
}]

function getNewData(newdata){
  newData.map(e=>({ ...e, load: 1 }));
  var list =[];
  list = newData.sort(function(a,b){
   return a.cost - b.cost && a.load - b.load;  
 })
}
render(){
 <style>
              .overlay{
                background-color: #e9e9e9;
                opacity: 0.7;
                position: absolute;
                left: 0px;
                top: 0px;
                z-index: 100;
                height: 100%;
                width: 100%;
                overflow: hidden;
                background-image: url('../images/loader.svg');
                background-position: center;
                background-repeat: no-repeat;
              }
              .loadingimg{
                background: url(../images/loader-img.svg) center center no-epeat;
                height: 100%;
                z-index: 20;
              }
</style>

 list.map(e=>{
  return html`
            <div class="overlay" id="overlay-${e.id}">
              <div class="loadingimg" id="loading-${e.id}"></div>
            </div>
          <p>Welcome to ${e.id}</p>
  `;
 }) 
}

如果是多次调用,此方法可能会给您更好的控制权:https://css-tricks.com/multiple-simultaneous-ajax-requests-one-callback-jquery/ ...或设置一个变量,例如var step = 0 并使用 step++ 成功更新它,然后完成 if (step === elements.length) doSomething()

您也可以按照以下方式做一些事情:

var elements = ["trans", "fund", "service"];
var step = 0;

function recursiveDataFetch(arr) {
  var data = arr.shift();
  if (data === undefined) return;
  step++;
  $.get(url, function(response) {
    if (step < elements.length) return recursiveDataFetch(arr);
    return doSomethingWhenAllIsReady();
  });
}

如果我误解了问题并且这是一个单一的调用,那么你只是在等待数据出现在删除加载程序之前,然后只需使用回调或看看我在这里写的东西:https://jsfiddle.net/darcher/4hqo57wv/(注意:这是 vanilla js,但应该有所帮助。)