2016-05-14 5 views
2

Ich habe eine Wetter-Website gebaut, die die Flickr API 1st ruft, ruft dann die Yahoo API für das Wetter. Das Problem ist, dass die Daten vom Ajax-Aufruf - von der Yahoo-API - nicht rechtzeitig zur Verfügung stehen, damit die Seite ihren Inhalt laden kann.Ajax Anruf wird nicht synchron ausgeführt

Einige der Dinge, die ich verwendet habe, um zu versuchen und den Ajax-Aufruf zu verlangsamen:

  • setTimeout
  • die gesamte Funktion Einwickeln dass $.ajax(success:) Anrufe in einer anderen Funktion, Einwickeln in setTimeout
  • die Einnahme Callback-Funktion aus $.ajax(success:), und setzen in die $.ajax(complete:) param
  • unter der data Objekt, dass $.ajax(success:) geht in und Kopieren, dass dann zu einem anderen var außerhalb von Ajax-Aufruf zu gehen und die Funktion setzen, dass die Daten innerhalb von $.ajaxComplete() Griffen, neues Objekt übergibt var

Es gibt mehr Möglichkeiten, dass ich versucht habe, zu gehen das, aber ich bin seit 3 ​​Tagen dabei und kann keine Lösung finden. Kann mir bitte jemand helfen hier

Hier ist ein Link zu dem Projekt ist

My Weather App On codeine.io

function RunCALL(url) 
    { 
     var comeBack = $.ajax({ 
     url: url, 
     async: false, 
     dataType:"jsonp", 
     crossDomain: true, 
     method: 'POST', 
     statusCode: { 
     404: function() {console.log("-4-4-4-4 WE GOT 404!");}, 
     200: function() {console.log("-2-2-2-2 WE GOT 200!");}}, 
     success: function(data){ 
     weatherAndFlickrReport(data);},                              
     error: function(e) {console.log(e);}   
    }); 
    } 
+1

können Sie uns Code zeigen? – Pevara

+0

Asynchronicity ist der Punkt von Ajax (das A steht für "Asynchronous"). Wenn Sie die gesamte Logik in den Success-Handler legen und kein Teil der Seite davon abhängt, dass Ajax sofort zurückkommt, ist alles in Ordnung. –

+0

Bitte zeigen Sie Ihren Code. Wir können keine asynchronen Probleme ohne sie beheben – charlietfl

Antwort

0

Sie jQuery verwenden? Wenn ja, müssen Sie Ihre Rückrufe verketten. Welche auf einem hohen Niveau, sieht würde so etwas wie:

//You might want to use .get or .getJSON, it's up to what response you're expecting... 
$.getJSON('https://example.com/api/flickr', function(response) { 
    //This your callback. The URL would end up being https://example.com/api/yahoo/?criteria=lalalalala 
    $.getJSON('https://example.com/api/yahoo/', { criteria: response.propertyYouWant}, function(yahooResponse) { 
    //Do something with your response here. 
    }); 
}); 

Edit: Ich habe Ihre Schnipsel mit einer Arbeitslösung aktualisiert haben (basierend auf dem oben AJAX-Requests), die jetzt zeigt sowohl Ihre JSON für das Konsumieren bereit Objekte. Looky here.

+0

Ja, ich benutze jQuery. Jedoch wird das gleiche $ .ajax für den Flickr- und Yahoo-Aufruf ausgeführt. Ich verwende keine Flickr-Daten, um Yahoo-Daten abzurufen. Seine zwei getrennten Aufrufe, genau die gleiche Funktion, um zwei diff-Anfragen zu behandeln. Ich habe Flags gesetzt, um sicherzustellen, dass sie sich nicht gegenseitig überlaufen. Warum kann ich das nicht in $ .ajax() tun? Wie kann ich die Daten des Anrufs vollständig empfangen und an die gewünschte Funktion senden? Ich möchte nicht die Daten in der gleichen Funktion behandeln, die ich den Anruf einberufen habe. – wizeOnes

+0

Das ist die ganze Natur der asynchronen Muster und die Notwendigkeit für Rückrufe.Sie können niemals garantieren, dass Sie Daten getrennt von diesen beiden API-Aufrufen erhalten können (es sei denn, wir sprechen über Renditen und Versprechen und Generatoren und andere ES6-Muster, aber das ist ein ganz anderes Thema). Unabhängig davon, ob Sie es mit .ajax oder .getJSON verwenden, müssen Sie einen Callback für einen API-Aufruf implementieren, um mit dem nächsten zu verketten, und dieser Callback kümmert sich dann um alles, was als nächstes passieren muss. Und Ihr Callback kann eine Funktion sein ... Sie müssen keine Inline-AJAX-Anfrage an sich haben ... – napo

+0

Ich habe Probleme, mehr Code zu posten, um meine Implementierung anzuzeigen – wizeOnes