难以理解与承诺和范围相关的错误

时间:2018-06-02 07:01:30

标签: javascript particle.io

我正在为一个粒子光子工作一个小小的前端,我已将其配置为js的学习练习。

我遇到了错误,我无法弄清楚原因。

在代码的前面,我使用粒子脚本登录https://docs.particle.io/reference/javascript/#with-username-password

var particle = new Particle();
var token;

particle.login({username: 'user@email.com', password: 'pass'}).then(
  function(data) {
    token = data.body.access_token;
  },
  function (err) {
    console.log('Could not log in.', err);
  }
);

在这个例子中,我使用particle.login()然后立即使用.then。 它工作得很好,我得到了我期望的令牌。

接下来我想列出我的所有设备,我使用文档中的示例代码来执行此操作:

var devicesPr = particle.listDevices({ auth: token });

devicesPr.then(
  function(devices){
    console.log('Devices: ', devices);
  },
  function(err) {
    console.log('List devices call failed: ', err);
  }
);

这也很有效。没有问题。

这是我的问题:

我心里想着“哎呀,为什么我不去掉这个var devicesPr,然后立即打电话给它”。所以我试试:

particle.listDevices({auth: token}).then(
    function(devices){
        console.log('Devices: ', devices);
    },
    function(err) {
        console.log('List of devices call failed: ', err);
    }
);

现在我收到一条错误说:

init.js:23 List of devices call failed:  {statusCode: 400, errorDescription: "HTTP error 400 from /v1/devices - The access token was not found", error: Error: Unsuccessful HTTP response
    at Request.<anonymous> (http://cdn.jsdelivr.net/particle-api-j…, body: {…}}
init.js:11 API call completed on promise resolve: API KEY

所以我注意到,在生成身份验证令牌之前,似乎正在执行设备列表的请求。我认为这是可能的,因为promises的文档一直提到它们是异步的。

我很困惑,为什么当我首先将变量变为变量然后再调用它时,我没有看到相同的可能错误?如果我先将promise保存到变量中,它是否知道等待auth令牌存在?

谢谢!

正在运行它时出现完整的故障代码:

"use strict";

//var Particle = require('particle-api-js');
var particle = new Particle();
var token;


particle.login({username: 'MYEMAIL', password:'MYPASSWORD'}).then(
  function(data){
    token = data.body.access_token;
    console.log('API call completed on promise resolve: ', token);
  },
  function(err) {
    console.log('API call completed on promise fail: ', err);
  }
);

particle.listDevices({auth: token}).then(
    function(devices){
        console.log('Devices: ', devices);
    },
    function(err) {
        console.log('List of devices call failed: ', err);
    }
);

1 个答案:

答案 0 :(得分:2)

您未listDevices使用token来自particle.login - 您同步拨打particle.listDevices ,在填充token之前。获取令牌的请求可能已经发送,但填充.then的异步token肯定还没有发送。

相反,请使用.thenlistDevices之后链接particle.login,如下所示:

var particle = new Particle();
particle.login({username: 'MYEMAIL', password:'MYPASSWORD'})
  .then(data => {
    const token = data.body.access_token;
    console.log('API call completed on promise resolve: ', token);
    // Return the listDevices promise so `.then` can be called on it below:
    return particle.listDevices({auth: token});
  })
  .catch(err => console.log('API call completed on promise fail: ', err))
  .then(devices => console.log('Devices: ', devices))
  .catch(console.log('List of devices call failed: ', err));