Переменные не устанавливаются внутри части .then () в Promise

1

Я новичок в JavaScript и node.js, и поэтому бросание в Promises довольно сложно, когда требуется, чтобы мой бот функционировал.

var storedUserID;
ROBLOX.getIdFromUsername(accountArg).then(function(userID) {
  message.reply("your id is " + userID);
  storedUserID = userID;
});
message.reply(storedUserID);

Это, по сути, то, что я написал, он создает переменную с именем " storedUserID ", которую я хотел бы обновить позже. Я пытаюсь обновить его в Promise, но он, похоже, не работает.

В коде есть message.reply("ваш id" + userID); который работает так, как ожидалось. Он будет распечатывать пользователю "ваш идентификатор [NUMBER]", поэтому я знаю, что идентификатор пользователя не равен нулю.

Однако, когда я запускаю message.reply(storedUserID); вне Promise, ничего не печатается, поскольку переменная не сохраняется. Я не знаю, почему.

Любая помощь будет оценена по мере того, как это пойдет на мою работу в колледже! Спасибо!

  • 0
    then выполняется асинхронно. К тому времени, когда вы регистрируете этот обратный вызов, еще не выполнен
  • 0
    @IngoBürk IngoBürk См. OP в разделе «который я хотел бы обновить позже». Как связанные Вопросы и ответы демонстрируют, как изменить ценность Promise ?
Теги:

2 ответа

1
Лучший ответ

return значение в функцию, переданную в .then()

var storedUserID = ROBLOX.getIdFromUsername(accountArg)
                   .then(function(userID) {
                     return userID;
                   });

вы можете использовать или изменить значение Promise когда это необходимо

storedUserID = storedUserID.then(id) {
  return /* change value of Promise 'storedUserID' here */
});

доступ и передать значение message.reply() в .then()

storedUserID.then(function(id) {
  message.reply(id);
});

или же

var storedUserID = ROBLOX.getIdFromUsername(accountArg);
// later in code
storedUserID.then(function(id) {
  message.reply(id);
});
  • 0
    Какой смысл сопоставлять обещание с самим собой?
  • 0
    @ IngoBürk Вы имеете в виду второй пример в обновленном сообщении?
Показать ещё 4 комментария
0

Поскольку getIdFromUsername является асинхронным, конечная строка, в которой вы указываете message.reply, сохраненный идентификатор запускается до того, как ID будет сохранен.

Асинхронные функции, такие как getIdFromUsername, не останавливают выполнение следующих строк кода. Если вы хотите, чтобы это произошло после того, как идентификатор возвращается он должен пойти внутри then обратного вызова.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню