Использование Async / Await для контроля порядка операций - PullRequest
0 голосов
/ 15 января 2019

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

Однако я иногда сталкивался с тем, что первый запрос не будет выполнен до запуска второй функции, и поэтому данные будут повреждены и не синхронизированы. Я временно обработал это с таймаутом для второй функции. Однако вместо этого я бы хотел использовать async / await, поскольку это, несомненно, лучший (и гарантированный) способ обработки чего-то подобного - поскольку никогда не стоит предполагать, что тайм-аут сработает, а может и нет.

Это то, что у меня сейчас есть:

private async moveRecord(stage) {
    if (!this.customer || !this.selectedService) return;
    let targetService = this.selectedService.service;
    let staffStarted = await this.userAccessService.getTargetId();

    this.clientMoveService.moveClientRecord(this.client._id, category, targetService, staffStarted);

    setTimeout(() =>
    {
        this.getNextStageOperation();
    }, 1000);
}

Как я могу настроить этот код, чтобы использовать async / await для запуска this.getNextOperation только после того, как первый запрос this.clientMoveService.moveClientRecord() завершен?

Могу я просто сделать это?

private async moveRecord(stage) {
    if (!this.customer || !this.selectedService) return;
    let targetService = this.selectedService.service;
    let staffStarted = await this.userAccessService.getTargetId();

    await this.clientMoveService.moveClientRecord(this.client._id, category, targetService, staffStarted);

    this.getNextStageOperation();
}

Для большей ясности, moveClientRecord() - это запрос, который выходит за пределы сокетов и выглядит так:

public moveClientRecord(clientId: string, category: string, service: string, staffStarted: string)
{
    let args = { id: clientId, category: category, service: service, staff: staffStarted };
    console.log('args: ', args);

    API.service.cast({
        eventName: `clients.updateStatus`,
        args: args,
        listener: function (data)
        {
            // Ignore if socket disconnects
            if (data === 'disconnect' || data === 'error') return;

            // Return true to stop event listener
            return true;

        }.bind(this)
    });
}

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Если this.clientMoveService.moveClientRecord возвращает обещание, вы можете просто сделать

await this.clientMoveService.moveClientRecord(this.client._id, category, targetService, staffStarted);
0 голосов
/ 16 января 2019

Будет работать так:

private async moveRecord(stage) {
    if (!this.customer || !this.selectedService) return;
    let targetService = this.selectedService.service;
    let staffStarted = await this.userAccessService.getTargetId();

    // must return a Promise
    await this.clientMoveService.moveClientRecord(this.client._id, 
    category, targetService, staffStarted);

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