在 jQuery/JavaScript 中使用承诺时遇到问题。脚本似乎不等待

Having trouble using promises in jQuery/JavaScript. Script doesn't seem to wait

我正在编写一个 Particle Photon(如 Arduino)。我正在尝试从中调用一个变量,然后使用该变量将 .css class 添加到 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 的新手,但我一直在阅读大量有关回调和承诺的资料,但一无所获。知道如何实现吗?

这里有几个问题。

  1. 您的 getVariable() 函数需要 return 来自 particle.getVariable() 的承诺。这将允许 getVariable() 的调用者在 returned 结果上使用 .then() 来获得异步结果。

  2. Promises 不会神奇地将异步操作变成同步操作。因此,您的 getVariable() 函数仍然是异步的,因为它依赖于 particle.getVariable() 的异步结果。所以,你不能直接 return 结果。相反,您应该使它 return 成为一个承诺,并且该函数的调用者可以使用 .then() 来检索异步结果。

  3. 由于 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
});

有关 returning 异步值的更多描述,您可以查看:How do I return the response from an asynchronous call?