2016-03-30 10 views
0

ich noch Rückruf/Versprechen Probleme haben :-)

Ich versuche, eine Reihe von Funktions jeder der Funktion zu implementieren, warten auf einen Rückgabewert von der nächsten .

Ich habe einen Ajax-Aufruf, der eine json auf Erfolg zurückkehrt, in dem Erfolg Block Ich sende diese json zu einer Asynchron-Funktion Validierung.

In validation() Ich bin ein Skript geladen und für jedes Objekt, das ich es Verfügbarkeit Funktion senden, möchte ich für die Verfügbarkeit warten, zu vervollständigen und den Wert zurück, jeden Wert, die Rückkehr wird geschoben ein Array, das ich am Ende senden möchte.

Ich habe Probleme mit den Callback-Implementierungen.

var validArr = []; 

function checkStory(callback) { 
    $.ajax({ 
    url: "", 
    type: "GET", 
    data: "", 
    async: true, 
    headers: { 
     Accept: "application/json" 
    }, 
    success: function(data) { 
     if (data.isDoc == true) { 
     _checkDoc(callback); 
     } else { 
     if (data.responseObj) { 
      validation(data.responseObj); 
     } else { 
      callback(data.count); 
     } 
     } 
    }, 
    error: function(err) { 
     console.log("No books"); 
    } 
    }); 
} 

function validation(responseObj) { 
    getScript('books.js', 
    function() { 
     $.each(responseObj, function(_index, _value) { 
     var res = aviliabilty(_value); 
     if (res) { 
      validArr.push(_index, true); 
     } else { 
      validArr.push(_index, false); 
     } 
     }); 
     //return after all objects completed execution 

     return validArr; 
    } 
); 
} 

function aviliabilty(entry) { 
    DM.ct.get(entry, function(response) { 
    if (response) { 
     for (var idx = 0, adLen = response.ds.length; idx < adLen; idx++) { 
     var bk = response.ds[idx]; 
     for (var creaIdx = 0, crea = bk.creatives.length; creaIdx < crea; creaIdx++) { 
      var creative = bk.creatives[creaIdx]; 
      if (creative.type == "line") { 
      for (var mfIdx = 0, mfLen = creative.Files.length; mfIdx < mfLen; mfIdx++) { 
       var mediaFile = creative.Files[mfIdx]; 
       if (mediaFile.type == "horror") { 
       return true; 
       } 
      } 
      } else if (creative.type != "horror") { 
      return false; 
      } 
     } 

     } 
    } 

    }); 
} 


// a function to get the script asynchronously 
function getScript(url, success) { 
    var script = document.createElement('script'); 
    script.src = url; 
    var head = document.getElementsByTagName('head')[0], 
     done = false; 
    // Attach handlers for all browsers 
    script.onload = script.onreadystatechange = function() { 
     if (!done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete')) { 
      done = true; 
      success(); 
      script.onload = script.onreadystatechange = null; 
      head.removeChild(script); 
     } 
    }; 
    head.appendChild(script); 
} 
+0

Was 'getScript ist()' und warum tun Sie es nennen, jedes Mal 'Validierung()' ist namens? Was ist '_checkDoc()'? Wer ruft 'checkStory()' auf? – Tomalak

+0

Zusätzlich zu @ Tomalaks Kommentar, was ist 'DM.ct'? –

+0

@Tomalak, _checkDoc() und checkStory() sind andere Funktionen in meinem aktuellen Skript und werden nicht in meinem Flow verwendet. Die Validierung wird nicht jedes Mal aufgerufen, bei der Validierung führe ich aviliabilty() für jedes Objekt in meiner Antwort aus. DM.ct ist eine Funktion von externem Skript. – ohadsas

Antwort

-2
  • Option 1: einen Rückruf verwenden -

    validation(data.responseObj, function(){ 
    
        }) 
    
        function validation(responseObj, callback) { 
    
         //your code.... 
    
         callback(validArr)  
        } 
    
    • Option 2: Verwenden Versprechen -

      Validierung (data.responseObj) .then (function (validArr) {
      });

      Funktion Validierung (responseObj, Rückruf) {

      var defer = Q.defer() 
          //your code.... 
      
          defer.resolve(validArr) 
      
          return defer.promise 
      

      }

Verwandte Themen