Ваш подход, использующий await
в обратном вызове async
then
, будет работать, но он неоправданно сложен, если all , который вы хотите сделать, это вызвать функцию async
и распространить ее результат черезцепь.Но если вы занимаетесь другими делами и хотите использовать преимущества синтаксиса async
функций, это нормально.Я вернусь к этому через мгновение.
async
функции возвращают обещания, поэтому вы просто возвращаете результат вызова своей функции:
function functionThatCannotHaveAsyncKeyword() {
functionA()
.then(function() {
return functionB(someArgument);
})
.then(function() {
console.log('last');
}); // <=== Note: You need a `catch` here, or this function needs
// to return the promise chain to its caller so its caller can
// handle errors
}
Если вы хотите передать *Значение разрешения 1014 * в functionB
, вы можете сделать это еще более напрямую:
functionA()
.then(functionB)
// ...
Когда вы возвращаете обещание из then
обратного вызова, обещание, созданное вызовом then
подчинено обещанию, которое вы возвращаете.
Пример:
const wait = (duration, ...args) => new Promise(resolve => {
setTimeout(resolve, duration, ...args);
});
async function functionA() {
await wait(500);
return 42;
}
async function functionB() {
await wait(200);
return "answer";
}
functionB()
.then(result => {
console.log(result); // "answer"
return functionA();
})
.then(result => {
console.log(result); // 42
})
.catch(error => {
// ...handle error...
});
Возвращаясь к вашему подходу с помощью обратного вызова async
then
: это тоже работает, и имеет смысл, когда вы делаете больше вещей:
const wait = (duration, ...args) => new Promise(resolve => {
setTimeout(resolve, duration, ...args);
});
async function functionA() {
await wait(500);
return 42;
}
async function functionB() {
await wait(200);
return "answer";
}
functionB()
.then(async (result) => {
console.log(result); // "answer"
const v = await functionA();
if (v < 60) {
console.log("Waiting 400ms...");
await wait(400);
console.log("Done waiting");
}
console.log(v); // 42
})
.catch(error => {
// ...handle error...
});