Как заставить асинхронную функцию JS работать синхронно с другими?

1

Следующий код JS:

function promise_GetSomething() {
    return new Promise(resolve => {
        setTimeout(function () {
            resolve("Something gotten after 3 sec.");
        }, 3000);
    });
}

async function logAboutSomethingGotten() {
    console.log("Before getting 3-sec-something.");
    var somethingGotten = await promise_GetSomething();
    console.log(somethingGotten);
    console.log("After getting 3-sec-something.");
}

function doSomething() {
    console.log("START");
    logAboutSomethingGotten();
    console.log("STOP");
}

doSomething();

... печатает следующее:

START
Before getting 3-sec-something.
STOP
Something gotten after 3 sec.
After getting 3-sec-something.

Как я могу настроить его, чтобы напечатать следующее?

START
Before getting 3-sec-something.
Something gotten after 3 sec.
After getting 3-sec-something.
STOP

Кроме того, если async logAboutSomethingGotten() возвращает значение, как его можно получить и использовать синхронно?

РЕДАКТИРОВАТЬ (UTC 2019-01-12 23:14):

Спасибо текущим ответчикам. Все текущие ответы в основном предлагают сделать doSomething() и ожидать logAboutSomethingGotten(). Я тоже это знал, но, поскольку это могло привести к бесконечному асинхронному коду, мне не понравилось это решение. Кроме того, опция, включающая .then(function() { console.log("STOP"); }) logAboutSomethingGotten() тоже легко как-то решит это, но не во всех сценариях, как в синхронной части моего вопроса.

Итак, меня особенно интересует, возвращает ли logAboutSomethingGotten() значение (например, после выполнения вызова Ajax, потому что синхронный Ajax устарел). Каким умным способом я могу использовать это возвращаемое значение в синхронном потоке?

Теги:
async-await

3 ответа

1

Просто отметьте doSomething в async, а затем await в logAboutSomethingGotten(); вызов.

Если async logAboutSomethingGotten() возвращает значение, как его можно получить и использовать синхронно?

Асинхронный результат никогда не может использоваться синхронно. Конечно, после ожидания обещания вы всегда можете использовать возвращаемое значение как обычно.

  • 0
    Я особенно заинтересован в использовании асинхронного результата в синхронном режиме. Я на самом деле понял, что могу продолжать добавлять слова «асинхронный» и «ждать» бесконечно. Можете ли вы предоставить обходной путь?
  • 0
    @ Olumide Нет. Когда я писал никогда , я имел в виду, что это невозможно. Вы должны добавить async и await везде.
1

Do this->

async function doSomething() {
    console.log("START");
    await logAboutSomethingGotten();
    console.log("STOP");

}

Проверьте snip-

function promise_GetSomething() {
    return new Promise(resolve => {
        setTimeout(function () {
            resolve("Something gotten after 3 sec.");
        }, 3000);
    });
}

async function logAboutSomethingGotten() {
    console.log("Before getting 3-sec-something.");
    var somethingGotten = await promise_GetSomething();
    console.log(somethingGotten);
    console.log("After getting 3-sec-something.");
}

async function doSomething() {
    console.log("START");
    await logAboutSomethingGotten();
    console.log("STOP");
    
}

doSomething();
0

Установите функцию doSomething также как асинхронную и logAboutSomethingGotten.

function promise_GetSomething() {
    return new Promise(resolve => {
        setTimeout(function () {
            resolve("Something gotten after 3 sec.");
        }, 3000);
    });
}

async function logAboutSomethingGotten() {
    console.log("Before getting 3-sec-something.");
    var somethingGotten = await promise_GetSomething();
    console.log(somethingGotten);
    console.log("After getting 3-sec-something.");
}

async function doSomething() {
    console.log("START");
    await logAboutSomethingGotten();
    console.log("STOP");
}

doSomething();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню