Javascript - как заставить ждать результата

РЕШЕНИЕ В КОНЦЕ ВОПРОСА

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

Я читаю часть этого документа «Подтверждение, предупреждения и сообщения об ошибках», чтобы сделать это: Ссылка на DOC

Файлы .js и .css вы можете найти здесь и здесь, если хотите протестировать

Но в этой части моего кода я должен проверить, ИСТИНА ли переменная, прежде чем показывать модальное окно подтверждения:

if (verifyPermission === true){    
        FLUIGC.message.confirm({
            message: "Would you like to allow this?",
            title: 'Without permission',
            labelYes: 'Yes',
            labelNo: 'No'
            }, function (result, el, ev) {                   
                if (!result) {
                    return; //Not allowed, so here must cancel the execution
                }
            }
        });
        //I want to the application stops here until the user confirm
}

//The rest of code is here below

Хотелось бы, если verifyPermission правда, то попросят подтверждения. Если пользователь отвечает «Нет», код должен перестать работать.

Но происходит то, что отображается вопрос подтверждения, но остальной код выполняется, не дожидаясь подтверждения.

Я не могу поместить остальной код в function(result, el, ev), потому что это много кода, и я думаю, что он будет иметь репликацию кода. И я не знаю, будет ли хорошей практикой размещение остального кода в функции.

Подскажите, пожалуйста, как это сделать?

РЕШЕНИЕ - ИСПОЛЬЗУЙТЕ ФУНКЦИЮ JAVASCRIPT ASYNC

Я поставил слово «async» перед функцией, которая проверяет verifyPermission. И я оставил такой код:

async function myFunc() {
    if (verifyPermission === true){    
            var result = await confirmPermission();                
            if(!result){
                    return;
            }
    }
    // rest of code here
}

И я создал эту функцию:

function confirmPermission(){

        return new Promise(resolve => {
            FLUIGC.message.confirm({
                message: "Would you like to allow this?",
                title: 'Without Permission',
                labelYes: 'Yes',
                labelNo: 'No'
            }, function (result, el, ev) {            
                resolve(result);
            });
        }); 
    }

Функция является обратным вызовом ... поэтому она должна обрабатывать случай и принадлежать ему. Вы можете избежать репликации путем дальнейшего рефакторинга в функции

Attersson 10.08.2018 16:48

Да, поместите остальной код в обратный вызов, вот для чего он нужен. Если вас беспокоит дублирование кода, поместите остальной код в отдельную функцию и вызовите эту функцию из обратного вызова.

Daniel Beck 10.08.2018 17:10
0
3
1 418
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Поместите свой код в обратный вызов.

if (verifyPermission === true){    
    FLUIGC.message.confirm({
        message: "Would you like to allow this?",
        title: 'Without permission',
        labelYes: 'Yes',
        labelNo: 'No'
        }, function (result, el, ev) {                   
               if (!result) {
                   return; //Not allowed, so here must cancel the execution
               else{
                //your code here
               }
            }
        }
    });
}
Ответ принят как подходящий

Поместите async перед функцией и сделайте цепочку обещаний или что-то в этом роде. Это гарантирует, что код выполняется в последовательном порядке.

Источник: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

Обновлено: Я на самом деле не слишком знаком с этим, поэтому лучше прочитать исходный код и внимательно его изучить.

На самом деле это не ответ на этот вопрос, и «обеспечение последовательного выполнения кода» по сути противоположно тому, что делает async. (Вероятно, лучше не публиковать ответы о вещах, с которыми вы не знакомы ...)

Daniel Beck 10.08.2018 17:12

@DanielBeck Определение Google для асинхронного режима: (of two or more objects or events) not existing or happening at the same time.

mathmaniac88 10.08.2018 17:16

да!!!! это то, чего я действительно хотел! Я реализовал здесь, и это сработало так, как я хочу

WitnessTruth 10.08.2018 17:17

рад помочь :)

mathmaniac88 10.08.2018 17:18

Спасибо! Теперь я могу решить многие из подобных ситуаций.

WitnessTruth 10.08.2018 19:24

Другие вопросы по теме