отправить переменную, чтобы поймать вне обещания в NodeJS

1

Я пытаюсь сделать бот для телеграммы и использовать для этого телеграмму-узел-бот. Я освобождаю свой бот на сервере, теперь делаю некоторые исправления и перезагружаю его. После этого в моей консоли я получил ошибки API телеграммы с сообщением о том, что я не могу отправлять сообщения пользователям, которые были заблокированы или заблокированы моим ботом. Я могу легко поймать эти ошибки, если попытаюсь отправить сообщение следующим образом:

for(var i=0;i<users.length;i++){
  let uid = users[i].chatid;
  tg.api.sendMessage(uid, "Hello, world!")
    .catch(function(err) {
      console.log('err = '+JSON.stringify(err))
      console.log('uid = '+uid) // undefined
    })
}

Результатом этого будет результат следующим образом:

err = {"_code":403,"_description":"Forbidden: bot was blocked by the user"}

И... и это не препятствует мне ничего не делать ПОТОМУ uid еще не определено, и я не могу ничего сделать с этой ошибкой. Как передать uid этому улову?

  • 1
    какова ценность users[i].chatid
  • 0
    такие номера, как 1231423
Показать ещё 6 комментариев
Теги:
ecmascript-6
es6-promise

1 ответ

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

Вы можете попробовать следующее:

const Fail = function(detail)=>{this.detail=detail;};
Promise.all(
  users.map(
    user =>
      tg.api.sendMessage(user.chatid, "Hello, world!")
      .then(
        undefined,//do not handle resolve, do that later
        err => new fail([err,user])
      )
  )  
)
.then(
  results => {
    const sucesses = results.filter(result=>(result&&result.constructor)!==Fail);
    const failures = results.filter(result=>(result&&result.constructor)===Fail);
    console.log("all chats completed ,"+failures.length+" failed");
    console.log(
      "failure details:"
    );
    failures.forEach(
      fail=>{
        cosnt [reason,user] = fail.detail;
        console.log("failed because:",reason,"for user:",user.chatid);    
      }
    )
  }
);

Пожалуйста, дайте мне знать, если вам нужна дополнительная помощь.

Причина, по которой ваш код не работал:

Поскольку ваш код на самом деле не показывает никаких проблем, я должен угадать, что у одного из пользователей нет чата или что вы используете var uid или что-то действительно.

Связывание let ограничено в блоке for/while/if, но привязка var ограничена внутри функции (или глобальной, если вне функции).

Здесь я использую let binding binding и вижу, что он выводит ожидаемые результаты:

var i = -1,numbers=[1,2,3,4,5],promises=[];
while(++i<5){
  let number = numbers[i]; // using let, should work as expected
  console.log("in in the while loop",number);
  promises.push(Promise.resolve("")
    .then(
      _=>console.log("In resolved promise number is now:",number)
    )
  );
}
console.log("after while loop",i);
Promise.all(promises)
.then(x=>console.log("all promises resolved"))

Это использует привязку var поэтому вы получаете "неожиданные" результаты

var i = -1,numbers=[1,2,3,4,5],promises=[];
while(++i<5){
  var number = numbers[i]; // using var, should have "unexpected" results
  console.log("in in the while loop",number);
  promises.push(Promise.resolve("")
    .then(
      _=>console.log("In resolved promise number is now (should be 5)",number)
    )
  );
}
console.log("after while loop",i);
Promise.all(promises)
.then(x=>console.log("all promises resolved"))

Ещё вопросы

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