#javascript #es6-promise
#javascript #es6-обещание
Вопрос:
У меня есть эта функция, и я хочу дождаться ее следующим образом:
await triesPlay(blobSource, reference);
Но неожиданно он возвращает ошибку при достижении triesPlayResolve();
внутри этого if statment:
if(consecutive(exist)) {
report.consecutiveTried.push([reference, c]);
triesPlayResolve(); // reaching this produces the error
return;
}
Вот ошибка:
И вот функция:
function triesPlay(blobSource, reference) {
let triesPlayResolve;
int();
async function int() {
for(let c = 0; c < options.maxTry; c ) {
if(consecutive(exist)) {
report.consecutiveTried.push([reference, c]);
triesPlayResolve();
return;
}
await proccess();
function proccess() {
let proccessResolve;
int();
async function int() {
await Recognize(blobSource);
if(speechResult.simplify() === '') {
int();
return;
}
saveExpect(speechResult.simplify(), reference);
primaryExpects.push(speechResult.simplify());
proccessResolve();
}
return new Promise(resolve => {
proccessResolve = resolve;
});
}
}
report.maxTried.push(reference);
triesPlayResolve();
}
return new Promise(resolve => {
triesPlayResolve = resolve;
});
}
Для меня это не имеет никакого смысла!! как я могу это исправить? и почему это происходит?!
Комментарии:
1. почему вы пытаетесь получить
resolve
обратный вызов вне контекстаPromis
— ваш ode определенно нуждается в рефакторинге, поскольку это действительно сложно, что вам нужно для этого.
Ответ №1:
Вы вызываете функцию до того, как ваш new Promise
экземпляр в конце функции инициализирует переменную.
Но все это совершенно не нужно — async function
s работают таким образом из коробки, они всегда возвращают неявное обещание, которое разрешается, когда код в теле функции return
s , даже (или: особенно) после await
. Вам не нужна ни одна из этих внутренних вспомогательных функций.
Таким образом, вы можете упростить до
async function triesPlay(blobSource, reference) { /*
^^^^^ */
for (let c = 0; c < options.maxTry; c ) {
if (consecutive(exist)) {
report.consecutiveTried.push([reference, c]);
return;
// ^^^^^^^ this is enough!
}
while (speechResult.simplify() === '') {
await Recognize(blobSource);
}
saveExpect(speechResult.simplify(), reference);
primaryExpects.push(speechResult.simplify());
}
report.maxTried.push(reference);
}