Привет, ребята, я работал над Асинхронной Функцией и хочу, чтобы она возвращала имя, полученное от некоторых других вызовов API. Мой код, как показано ниже:
apiAccessor.ts
async registerName(): Promise<any>{
try{
await client.register((error, result) => {
if(error){
console.error(`Error register name: ${error}`);
}
else{
console.log('Registered Successfully!');
this.assignedPlace = result.assignedPlace;
console.log(this.assignedPlace);
}
});
return this.assignedPlace;
}
catch (error) {
this.logger.error(error.name, error.message);
}
main.ts
async function nameAssigner() {
let place = await client.registerName();
console.log(place);
}
nameAssigner();
Проблема в том, что console.log в main.ts
всегда будет запускаться первым (даже если я поместил console.log в обратный вызов обещания then
) и даст мне значение undefined
, а через некоторое время код в apiAccessor.ts
завершен, console.log в apiAccessor.ts
дал мне правильное значение, которое я хочу. Однако, похоже, это не возвращается main.ts
, как ожидалось.
Как я могу вернуть значение или дать main.ts
дождаться завершения функции в первую очередь?
Спасибо за чтение и ценит, если кто-нибудь может помочь!
2 ответа
Ваша проблема в том, что client.register не возвращает обещание, он принимает функцию обратного вызова, которая запускается изнутри, но не возвращает обещание. Вам нужно создать обещание и разрешить его в функции обратного вызова, а затем ожидать результата от обещания.
async registerName(): Promise<any>{
try{
let promise = new Promise(function(resolve, reject) {
client.register((error, result) => {
if(error){
reject(`Error register name: ${error}`);
}
else{
console.log('Registered Successfully!');
resolve(result.assignedPlace);
console.log(this.assignedPlace);
}
});
});
this.assignedPlace = await promise;
return this.assignedPlace;
}
catch (error) {
this.logger.error(error.name, error.message);
}
Из вашего кода похоже, что client.register((error, result) => {
использует обратный вызов и не возвращает обещание. Поэтому ваш await
перед ним не делает то, что вы думаете. Вы можете заключить ваш вызов в client.resolve
с помощью Promise
и разрешить / отклонить его только после того, как обратный вызов даст вам результат.
return new Promise((resolve,reject) => {
try {
client.register((error, result) => {
if(error){
console.error(`Error register name: ${error}`);
return reject(error);
}
else{
console.log('Registered Successfully!');
return resolve(result.assignedPlace);
}
});
}
catch (error) {
this.logger.error(error.name, error.message);
return reject(error);
}
});
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Обратите внимание, что JavaScript — это НЕ Java. Включите все теги, относящиеся к вашему вопросу: например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [стройный] и т. д.