我正在编程一个粒子光子(像Arduino)。我试图从中调用一个变量,然后使用该变量将.css类添加到div。
问题是变量不断返回
undefined
在初始通话中。但是,如果我在几秒钟后再次调用它,则效果很好。
这是来自Particle的API调用:
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);
});
这是我的版本:
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);
});
}
我希望能够像这样
$(".class").addClass(getVariable("var")
我对jQuery和Javascript还是很陌生,但是我一直在大量阅读回调和Promise,却一无所获。任何想法如何做到这一点?
最佳答案
您这里有几个问题。
您的getVariable()
函数需要从particle.getVariable()
返回承诺。这将允许getVariable()
的调用方在返回的结果上使用.then()
以获得异步结果。
承诺不会神奇地将异步操作变成同步操作。因此,您的getVariable()
函数仍然是异步的,因为它依赖于particle.getVariable()
的异步结果。因此,您不能直接返回结果。相反,您应该使它返回一个Promise,并且该函数的调用者可以使用.then()
检索异步结果。
由于getVariable()
将是异步的,因此您将需要使用getVariable(...)
.then(...)来访问异步结果。
更改为此:
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
});
有关返回异步值的更多描述,请参见:How do I return the response from an asynchronous call?