2016-07-13 20 views
0

Ich programmiere ein Partikel Photon (wie ein Arduino). Ich versuche, eine Variable von ihm aufzurufen und dann diese Variable zu verwenden, um einem Div eine CSS-Klasse hinzuzufügen.Probleme bei der Verwendung von Versprechen in jQuery/JavaScript. Script scheint nicht zu warten

Das Problem ist, dass der Variable auf dem ersten Aufruf zurück als

undefined 

kommt immer. Allerdings, wenn ich es ein paar Sekunden später noch einmal anrufe, funktioniert es gut.

Dies ist der API-Aufruf von Particle:

particle.getVariable({ deviceId: 'DEVICE_ID', name: 'temp', auth: token }).then(function(data) { 
    console.log('Device variable retrieved successfully:', data); 
}, function(err) { 
    console.log('An error occurred while getting attrs:', err); 
}); 

Hier ist meine Version davon ist:

function getVariable(varName) { 
particle.getVariable({ deviceId: device_ID, name: varName, auth: accessToken }).then(function(data) { 
    return data.body.result; 
    }, function(err) { 
     console.log('An error occurred while getting variable:', err); 
}); 
} 

Ich möchte in der Lage sein, mit diesem wie

$(".class").addClass(getVariable("var") 
zu arbeiten

Ich bin ziemlich neu in jQuery und Javascript, aber ich habe eine Menge gelesen auf Rückrufe und Versprechungen und nirgendwohin. Irgendeine Idee, wie man das erreicht?

Antwort

1

Sie haben hier einige Probleme.

  1. Ihre getVariable() Funktion muss das Versprechen von particle.getVariable() zurückzukehren. Das ermöglicht dem Aufrufer von getVariable(), für das zurückgegebene Ergebnis zu verwenden, um das asynchrone Ergebnis zu erhalten.

  2. Versprechen machen einen asynchronen Vorgang nicht magisch zu einem synchronen Vorgang. Ihre getVariable()-Funktion ist also immer noch asynchron, da sie auf dem Ergebnis von particle.getVariable() beruht, das asynchron ist. Daher können Sie das Ergebnis nicht direkt zurückgeben. Stattdessen sollten Sie eine Verheißung zurückgeben, und der Aufrufer dieser Funktion kann verwenden, um das asynchrone Ergebnis abzurufen.

  3. Da getVariable() asynchron ist, müssen Sie getVariable(...) .then (...) verwenden, um auf asynchrone Ergebnisse zugreifen zu können.

Änderung dieser:

function getVariable(varName) { 
    return particle.getVariable({ 
     deviceId: device_ID, 
     name: varName, 
     auth: accessToken 
    }).then(function (data) { 
     return data.body.result; // this becomes the fulfilled value of the promise 
    }, function (err) { 
     console.log('An error occurred while getting variable:', err); 
     throw err;     // rethrow error so it will propagate 
    }); 
} 

getVariable("var").then(function (result) { 
    $(".class").addClass(result); 
}, function(err) { 
    // handle error here 
}); 

Für viel mehr Beschreibung asynchrone Werte zurückzugeben, können Sie dies sehen: How do I return the response from an asynchronous call?

+0

Oh mein Gott. Ich danke dir sehr! Ich habe mit Variationen Ihres ersten Codeabschnitts gespielt, aber nie daran gedacht, ein Versprechen für den zweiten Abschnitt zu verwenden. Pfui. Gibt es eine Möglichkeit, es mit etwas wie '$ (". Class ") überhaupt funktionieren zu lassen. AddClass (getVariable (" var ")'? Ihre Lösung funktioniert, aber nur in der Hoffnung, zu vereinfachen help. – syndac

+0

@syndac - Nein, das Ergebnis ist async. Sie können das Ergebnis nicht direkt aus 'getVariable()' zurückgeben. – jfriend00

+0

Kein Problem. Nochmals vielen Dank für die Hilfe! – syndac