gpt4 book ai didi

javascript - 无法理解与 promise 和范围相关的错误

转载 作者:行者123 更新时间:2023-11-30 14:34:20 25 4
gpt4 key购买 nike

我正在为粒子光子开发一个小型网络前端,我已将其配置为 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 就可以了。它工作正常,我得到了我期望的 token 。

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

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

所以我注意到,似乎在生成授权 token 之前正在执行对设备列表的请求。我想这是有道理的,因为 promises 的文档不断提到它们是异步的。

我只是很困惑,为什么当我先将它设为一个变量然后调用 .then 时我看不到同样可能的错误?如果我先将 promise 存储到变量,它是否知道要等待身份验证 token 存在?

谢谢!

我运行时的完整故障代码:

"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);
}
);

最佳答案

您没有将 listDevices 与从 particle.login 获得的 token 链接在一起 - 您正在调用 particle.listDevices 同步,在 token 被填充之前。可能已经发送了获取 token 的请求,但是填充token 的异步.then 肯定还没有运行。

相反,使用 .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));

关于javascript - 无法理解与 promise 和范围相关的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50654379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com