Проблема понимания ошибки, связанной с обещаниями и областью действия - PullRequest
0 голосов
/ 02 июня 2018

Я работаю над небольшим веб-интерфейсом для фотона частицы, который я настроил в качестве учебного упражнения для 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);
  }
);

В этом примере я использую element.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

Итак, я замечаю, что кажется, что запрос на список устройств выполняется перед аутентификациейтокен сгенерирован.Я полагаю, что это имеет смысл, поскольку в документации об обещаниях постоянно упоминается, что они асинхронны.

Я просто запутался, почему не вижу такой же возможной ошибки, когда сначала задаю переменную, а затем вызываюпотом на это?Знает ли он как-то ждать, пока не появится маркер аутентификации, если я сначала сохраню обещание для переменной?

Спасибо!

Полный код неисправности при запуске:

"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 голосов
/ 02 июня 2018

Вы не соединяете 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));
...