Неожиданное разрешение не является функцией

#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);
}