Сделать асинхронную функцию для запуска синхронной - Javascript - PullRequest
0 голосов
/ 06 февраля 2019

Вот моя проблема:

Моя основная функция:

const mainFunction = () => {
    const reports = JSON.parse($sessionStorage.datas);
    // reports contains array of objects.
    // consider i have two objects inside one array, so the loop will execute two times now
    reports.forEach((item) => {
        this.openReport(item);
    });
};
mainFunction();

Функция openReport:

this.openReport = (report)  => {
    console.log('openReport working');
    // some async functions will be here
    // ajax calls
    this.openTab(report);
};

Функция openTab:

this.openTab = (report) => {
    console.log('handleOpenTab function working');
}

Вывод:

// Now i have two objects, so forEach works two times.
'openReport working'
'openReport working'

'handleOpenTab function working'
'handleOpenTab function working'

Мой ожидаемый вывод:

'openReport working'
'handleOpenTab function working'

'openReport working'
'handleOpenTab function working'

Как этого добиться?я не могу использовать async await внутри моей функции forEach, потому что использую старую версию узла.

Если возможно использовать async / await для этой проблемы, я попытаюсь обновить версию своего узла.

1 Ответ

0 голосов
/ 06 февраля 2019

Используя обещания, это будет выглядеть примерно так:

this.openReport = (report) => {
    console.log('openReport working');
    // some async functions will be here
    // ajax calls
    return new Promise(function(resolve, reject) {
        ajaxCall('url', resolve); // reject as necessary!
    }).then(answer => {
        this.openTab(report);
        return answer;
    });
};

const mainFunction = () => {
    const reports = JSON.parse($sessionStorage.datas);
    // reports contains array of objects.

    function getNextReport(index) {
        if (index >= reports.length) return Promise.resolve();
        let item = reports[index];
        return this.openReport(item).then(function(answer) {
            // do something with answer
            return getNextReport(index+1);
        });
    }

    return getNextReport(0);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...