javascript - 在 jQuery/JavaScript 中使用 Promise 时遇到问题。脚本似乎没有等待

标签 javascript jquery promise particles

我正在编写粒子光子(如 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 的内容,但一无所获。知道如何实现这一点吗?

最佳答案

您遇到了几个问题。

  1. 您的 getVariable() 函数需要从 article.getVariable() 返回 Promise。这将允许 getVariable() 的调用者对返回的结果使用 .then() 来获取异步结果。

  2. Promise 不会神奇地将异步操作变成同步操作。因此,您的 getVariable() 函数仍然是异步的,因为它依赖于异步的 article.getVariable() 的结果。所以,你不能直接返回结果。相反,您应该让它返回一个 Promise,并且该函数的调用者可以使用 .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
});

有关返回异步值的更多说明,您可以查看:How do I return the response from an asynchronous call?

关于javascript - 在 jQuery/JavaScript 中使用 Promise 时遇到问题。脚本似乎没有等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38363441/

相关文章:

jquery - 仅当用户一直向上滚动时显示 div

javascript - 选择的选项有什么问题?

javascript - 我如何将此 promise 返回给 Controller ?

javascript - 动态加载字体

javascript - 如何在 Google Apps 脚本中修改 HTMLOutput 之前的 html 文件

javascript - 根据父 ng-repeat 过滤 ng-repeat

javascript promise 不传递所有参数(使用 Q)

javascript - Webpack - 构建无依赖包

Jquery 使一个 Div 成为可点击的表单区域

node.js - 如何使 Node 抛出 UnhandledPromiseRejectionWarning 错误