Следующий код 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 устарел). Каким умным способом я могу использовать это возвращаемое значение в синхронном потоке?
Просто отметьте doSomething
в async
, а затем await
в logAboutSomethingGotten();
вызов.
Если async
logAboutSomethingGotten()
возвращает значение, как его можно получить и использовать синхронно?
Асинхронный результат никогда не может использоваться синхронно. Конечно, после ожидания обещания вы всегда можете использовать возвращаемое значение как обычно.
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();
Установите функцию 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();
async
иawait
везде.