我正在为一个粒子光子工作一个小小的前端,我已将其配置为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);
}
);
答案 0 :(得分:2)
您未listDevices
使用token
来自particle.login
- 您同步拨打particle.listDevices
,在填充token
之前。获取令牌的请求可能已经发送,但填充.then
的异步token
肯定还没有发送。
相反,请使用.then
在listDevices
之后链接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));