异步函数可以接受并执行回调函数吗?

时间:2019-07-16 03:50:11

标签: javascript async-await

最近,我对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); 

3 个答案:

答案 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
    });