最近,我对async / await
语法非常感兴趣,并且已经尝试了一段时间。
在这个特殊的问题中,我的目标是在做出所有承诺后(如果可能)执行回调函数。
我不知道如何在现实生活中应用自己的想法,因此我希望函数看起来像这样。
function endTask (task) {
// finalizes tasks
}
var taskCompleted = false;
async function doSomething (callback) {
const response = await fetch(some_url);
const task = await response.json();
if (task) {
taskCompleted = true;
}
if (typeof callback == "function" && taskCompleted) {
callback(task);
}
}
doSomething(endTask);
答案 0 :(得分:1)
异步/等待功能的目的是降低称为Callback Hell的复杂性。异步函数有效地消除了传递回调函数的必要性。
但是,仍然可以将回调函数传递给异步函数,以作为稍后在其逻辑中调用的引用。只要开发人员不会将Promises包裹在异步函数的范围内,这是完全可以的。该应用程序违反了异步/等待的概念。
异步函数在实际实践中总是采用参数,其中一些是回调函数,可以立即调用或传递给另一个函数。
代码的简写版本:
function endTask (task) {
// finalizes tasks
}
async function doSomething () {
const response = await fetch(some_url);
const task = await response.json();
if (typeof callback == "function" && task) {
endTask (task);
}
}
doSomething();
答案 1 :(得分:0)
我认为,如果您已经使用了异步/等待,则可能不再需要使用回调。异步/等待功能的目的是简化使用Promise的行为,并避免回调地狱。
希望以下示例可以提供帮助。
function endTask (task) {
// finalizes tasks
}
async function doSomething (callback) {
const task = await fetch(some_url).then(res => res.json());
return task;
}
async function main() {
const task = await doSomething();
if (task) {
endTask()
}
}
答案 2 :(得分:-2)
是的,async
函数可以像其他任何函数一样接受和调用回调,但是这几乎违背了使用async
函数的目的。在某些情况下,有充分理由这样做(请参阅下面的Dave Newton评论),但这不是其中之一。
相反,您应该执行以下操作:
function endTask(task) {
// finalizes tasks
}
var taskCompleted = false;
async function doSomething() {
const response = await fetch(some_url);
const task = await response.json();
return task;
}
doSomething()
.then(task => {
if (task) {
taskCompleted = true;
}
endTask(task);
})
.catch(error => {
// handle error
});