2016-07-20 3 views
0

Ich bin ein wenig neu in Javascript, und habe eine harte Zeit mit dem asynchronen Aspekt davon. Mein Programm überprüft Werte von zwei Objekten, wobei das zweite Objekt keine wichtige Eigenschaft besitzt, die ich brauche, um die Prüfung abzuschließen. Also habe ich versprochen, diesen Wert/diese Eigenschaft (die ID) zu bekommen, und jetzt muss ich diesen ID-Wert an eine Prüffunktion übergeben. Die Prüffunktion sollte einfach ein Wahr/Falsch zurückgeben, um zu sehen, ob die ID übereinstimmt. Der Wert der Check-Funktion wird an eine andere Funktion übergeben, die dann entsprechend handelt und die Sache bei Bedarf bearbeitet. Ich kann also grundsätzlich nicht auf den Tick-Wert außerhalb seiner Klammern zugreifen. Ich habe das Code-Schnipsel eingefügt, in dem all dies geschieht, da dies alles leichter zu visualisieren ist. Kann mir jemand eine Lösung für dieses Problem anbieten? Jeder Rat würde immens helfen! Ich möchte die Modifikation des Skripts so gering wie möglich halten.Wie kann ich den Wert eines Versprechens an eine andere Funktion übergeben?

var Q = require('q'); 

    getID = function(instance, person, callback){ 
      var = deferred = Q.defer(); 
      var url = 'www.blah.com'; 
      var options = { 
       'url': url 
      }; 

      request.get(options, function(error, response, body){ 
       if (error) { 
        deferred.reject(error); 
       }else{ 
        var res = body; 
        var obj = JSON.parse(res); 
        var id = obj.id; 
        deferred.resolve(id); 
       } else deferred(obj); 
      }); 


    check = function(instance, thing1, thing2){ 
     var tick = true; 
     getID(instance, thing2).then(function(id)){ 
      var id_1 = thing1.id; // thing1 passed into check with ID 
      var id_2 = thing2.id; // thing 2 now has id attached to it 
      if(id_1 == id_2){ 
       tick = true; // VALUE 1 
      }else{ 
       tick = false; // VALUE 2 
     }); 

     // NEED VALUE 1 OR 2 OF TICK HERE 

     if(thing1.name == thing2.name){ 
      tick = true; 
     else{ 
      tick = false; 
     } 

     // similar checks to name but with ADDRESS, EMAIL, PHONE NUMBER 
     // these properties are already appended to thing1 and thing 2 so no need to call for them 

    }; 

    editThing = function(instance, thing, callback){ 

     var checked = check(instance, thing1, thing2); 
     if(checked){ 
      // edit thing 
     }else{ 
      // don't edit thing   
    }; 
+0

Ist 'getID' Funktion des' deffered' Rückkehr? Es ist nicht in Ihrem Code-Snippet. – Victory

+0

var Q = erfordern ('q'); sollte ganz oben sein! – pokemongirl1234

+0

Das beantwortet die Frage nicht, ob Sie das 'deferred' Objekt in' getID' zurückgeben, damit es in 'check' verwendet werden kann? – Victory

Antwort

1

Da Sie ein Versprechen von Arbeit machst zu tun, und Sie müssen Ausgabe von dieser Arbeit, Sie Pass benötigen, die zusammen mit dem Code versprechen, die die endgültige Ausgabe ist zu wollen.

Ich werde versuchen, nicht den Code aus Ihrem Post neu zu schreiben, so erlauben Sie mir zu paraphrasieren:

getThing = function(thing){ 
    var deferred = Q.defer(); 
    ... 
    request.get(options, function(error, response, body){ 
    if (error) { 
     deferred.reject(error); 
    } else { 
     ... 
     deferred.resolve(thingMadeFromResponse); 
    } 
    }); 
    return deferred; 
} 

check = function(thingWeHave, thingWeNeedFetched){ 
    return getThing(thingWeNeedFetched).then(function(thingWeFetched)){ 
    // check logic 
    checked = thingWeHave.id == thingWeFetched.id; 
    ... 
    return checked; 
    }); 
}; 

editThing = function(instance, thing, callback){ 
    check(thingWeHave, thingWeNeedFetched).then(function(checked) { 
    if(checked){ 
     // edit thing 
    }else{ 
     // don't edit thing 
    } 
    }); 
}; 
+0

für die Funktionsüberprüfung, ich brauche sowohl thing1 und Sache 2, unterstützt diese Lösung dies? Ich habe es versucht und das Programm wird nicht ausgeführt. – pokemongirl1234

+0

Es ist nicht ganz klar, was Sie erwartet haben und was Sie von blah.com holen müssen. Daher ist es schwer zu wissen, was genau Sie benötigen. Ich bearbeite meine Antwort mit der Annahme, dass Sie bereits ein Objekt haben und versuchen, es mit den von blah.com abgerufenen Daten zu vergleichen ... – Will

+0

Also habe ich obj1, was in Ordnung ist, aber es wird über editThing übergeben, um zu überprüfen Funktion. Ich muss ID von getID für obj2 zurückholen und dann BEIDE Objekte durch eine Reihe von Überprüfungen passieren – pokemongirl1234

-2

Promises

„thenable“ ist ein Objekt oder eine Funktion, die dann Methode definiert.

+0

Also ein thenable ist nicht der richtige Weg, um die ID hier zu erhalten? – pokemongirl1234

+0

Versprechen sind der Weg zu gehen. Ihr Skript erfordert jedoch ein Polyfill, um über Browser hinweg zu funktionieren. Beachten Sie, dass Versprechungen an die Stelle von Callbacks treten, wie ich es verstehe. Also solltest du das eine oder andere benutzen. Tenable bedeutet Versprechen kompatibel, glaube ich. –

+0

Gibt es trotzdem den Wert ohne Polyfill abzurufen? Mir fällt es schwer zu verstehen, was du damit meinst. – pokemongirl1234

Verwandte Themen