我正在编程一个粒子光子(像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?

09-18 21:02