मैं एक JSON कॉल करने की कोशिश कर रहा हूं जो कुछ डेटा देता है। मेरे प्रत्येक फ़ंक्शन के अंदर मैं यह जांचने की कोशिश कर रहा हूं कि लौटा हुआ मान (पेज यूआरएल) मौजूद है या नहीं। जब मैं चाहता हूं कि यह सरणी में धक्का दे, जिसे मैं बाद में अपनी स्क्रिप्ट में उपयोग करना चाहता हूं। यदि यह अस्तित्व में नहीं है तो मैं एक अलग मूल्य को धक्का देना चाहता हूं। मैं जो कुछ भी कोशिश करता हूं मैं इसे काम पर नहीं ला सकता। इसका मतलब है कि मेरी स्क्रिप्ट गलत यूआरएल लौटाती है या यह मेरे सरणी में नए बनाए गए यूआरएल को धक्का नहीं देती है। या कम से कम यह मेरी सरणी में उपलब्ध नहीं है।

स्पष्टीकरण देना:

function brandUrlExists(url, callback){
   $.ajax({
       url: url,
       type: 'HEAD',
       success: function(){
        callback(true);
       }
   });
}
function menuBrands(curr, urljson){
  var brandsArr = []
  var br_list = curr.parent().find('.mega-menu .br_list .title')

  $.getJSON(urljson', function(data){

    var maincat = curr.data('maincat')
    $.each(data.brands, function(index, brand){

     var brandUrl = brand.title.replace(' ', '-').toLowerCase()
     
     // I want to test if this "testUrl" works/responds
     var testUrl = brand.title.replace(' ', '-').toLowerCase() + '/' + maincat      
     var newUrl = ''
     
     //if testUrl exists then create var "newUrl" and set "testUrl" otherwise the "brandUrl"
     brandUrlExists(testUrl, result => {
      newUrl = result ? testUrl : brandUrl
     })
     brandsArr.push(newUrl)
    });

    // problem I have here is that either the array has only the last "newUrl" of the list in the array or the array has only the 'brandUrl' as newUrl. 
    br_list.after(brandsArr.sort())
  });

मैं बस नहीं देख सकता कि मैं क्या गलत कर रहा हूँ। शायद मैं इसे लंबे समय से देख रहा हूं :( किसी भी मदद की बहुत सराहना की।

0
Meules 20 जिंदा 2021, 19:52
ध्यान दें: getJSON एक अतुल्यकालिक कॉल है
 – 
gaetanoM
20 जिंदा 2021, 20:11

1 उत्तर

सबसे बढ़िया उत्तर

आप कई अजाक्स अनुरोध चला रहे हैं। प्रत्येक अनुरोध अतुल्यकालिक है। ऐसा लगता है कि आप इसे जानते हैं, क्योंकि आप कॉलबैक सही तरीके से पास कर रहे हैं। अब आपको उस कॉलबैक में AJAX प्रतिक्रियाओं पर प्रदर्शन करने के लिए सभी तर्क रखना होगा।

ऊपर एक परत, प्रत्येक brandUrlExists कॉल पर, आपको यह सुनिश्चित करने के लिए brand पास करना चाहिए कि brandUrl और testUrl इस फ़ंक्शन कॉल के लिए विशिष्ट हैं। याद रखें कि आप एक लूप में हैं।

इसके अतिरिक्त, यदि url मौजूद नहीं है, तो आप कॉलबैक नहीं चला रहे थे...

मैंने यह सुनिश्चित करने के लिए कुछ var को let में बदल दिया है कि चर अपने कार्य के दायरे के लिए विशिष्ट है।

तो... मैंने कुछ भी परीक्षण नहीं किया है। इसे अजमाएं:

function brandUrlExists(brand, callback){

  // brandUrl and testUrl are specific to this brand check
  let brandUrl = brand.title.replace(' ', '-').toLowerCase()
  let testUrl = brand.title.replace(' ', '-').toLowerCase() + '/' + maincat

  $.ajax({
    url: testUrl,
    type: 'HEAD',
    success: function(){
      callback(true);
    },
    error: function(){ // If the page does not exist
      callback(false);
    }
  });
}

function menuBrands(curr, urljson){
var brandsArr = []
var br_list = curr.parent().find('.mega-menu .br_list .title')

$.getJSON(urljson, function(data){

  var maincat = curr.data('maincat')

  // How many brands to test?
  var brandCount = data.brands.length

  $.each(data.brands, function(index, brand){

    // Squarely pass "brand" to the function
    brandUrlExists(brand, result => {

      let newUrl = result ? testUrl : brandUrl
      brandsArr.push(newUrl)  // Push to array from inside the callback

      // If ALL the ajax requests are done
      if(brandsArr.length === brandCount){
        br_list.after(brandsArr.sort())
      }
    })

  });

});
1
Louys Patrice Bessette 20 जिंदा 2021, 20:57