Я пытаюсь сделать бот для телеграммы и использовать для этого телеграмму-узел-бот. Я освобождаю свой бот на сервере, теперь делаю некоторые исправления и перезагружаю его. После этого в моей консоли я получил ошибки 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
этому улову?
Вы можете попробовать следующее:
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"))
users[i].chatid