Как обрабатывать асинхронные задачи в axios - PullRequest
0 голосов
/ 27 марта 2020

Переменная arr ниже представляет собой набор похожих массивов.

 function site1(url){
    return axios.get(url)
     .then((response)=>{
        if(response.status==200){
            //code for getting data
            //arr=[]---------initial value  (globally declared variable)
            for(i=1;i<=limit;i++){
                arr.push(someData);
                //after this push arr=[[item1,item2,item3,item4,item5]]
                //arr is an collection of similar arrays
                //there are many links one for each array inside arr
                //-----operation here to get someLink-------


                for(a=0;a<arr.length;a++){
                    someOtherSite(somelink,arr).then((data)=>{
                        arr=data;

                    });
                }
            }


        }

        return arr;

    })

  }

function someOtherSite(url,arr){
 return axios.get(url)
          .then(response=>{
         //get some dataItem
          arr[arr.length-1].push(dataItem);
          return arr;
   })
 }

для вызова функции:

site1(url).then(data=>{
     console.log(data);
   })

Я хотел, чтобы значение arr было таким: arr = [ [item1, item2, item3, item4, item5, dataItem], .......], но возврат происходит раньше, и значение arr отображается без dataItem. Как заставить возврат значения ждать и происходить после завершения процесса.

1 Ответ

1 голос
/ 27 марта 2020

Ax ios - это HTTP-клиент, основанный на обещаниях, поэтому вам нужно дождаться возвращения ax ios, использовать asyn c function и await для ax ios .get, также используйте Promise для ожидания операций https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises

Вот пример вашего кода:

  function site1(url){
            return new Promise(async(resolve,reject)=>{
                await axios.get(url)
                 .then((response)=>{
                            //code for getting data
                            //arr=[]---------initially  globally declared
                        for(i=1;i<=limit;i++){
                            arr.push(someData);
                            for(a=0;a<arr.length;a++){
                                someOtherSite(somelink,arr).then((data)=>{
                                arr=data;
                                });
                            }
                        }
                        resolve(arr)
                    })
                 .catch(err=>{
                    reject(err)
                 })
            })
   }

function someOtherSite(url,arr){
    return new Promise(async(resolve,reject)=>{
         await axios.get(url)
                  .then(response=>{
                 //get some dataItem
                  arr[arr.length-1].push(dataItem);
                  resolve(arr);
                    })
                  .catch(err=>{
                    reject(err)
                  })
    })
}

для вызов функции:

    site1(url).then(data=>{
     console.log(data);
   })
...