Javascript JS async返回后执行任务

Javascript JS async返回后执行任务,javascript,async-await,Javascript,Async Await,我正在重写一些JavaScript代码,这些代码使用对异步函数的回调。基本上做: function doStuff(callbackFn){ var result = foo(); callbackFn(result); } //changing in async function(){ var result = foo(); return result; } //So I can change doStuff(function(x){ doSt

我正在重写一些JavaScript代码,这些代码使用对异步函数的回调。基本上做:

function doStuff(callbackFn){
    var result = foo();
    callbackFn(result);
}

//changing in

async function(){
    var result = foo();
    return result; 
}

//So I can change
doStuff(function(x){
     doStuffWith(x)
});

//into

doStuff().then(x => doStuffWith(x));
现在我遇到一个函数

function doStuff(callbackFn){
    var result = foo();
    var bar = callbackFn(result);
    baz(bar); 
}

我不知道如何开始这一步。。。有什么建议吗?

首先,您的callbackn还必须转换为异步。我假设您知道如何在转换为异步的承诺中包装同步函数

完成后,您只需执行以下操作:

async function doStuff(callbackFn) {
  const result = foo();
  const bar = await callbackFn(result); //callbackFn must be async
  await baz(bar); //baz function must be async

  return someResponse;
}

回调函数(主要)用于两个不同的目的:

  • 协调异步代码
  • 传递可执行代码段,而不是仅传递值
  • 第一种情况类似于#1,
    doStuff
    可能异步地执行某些操作,为了使其他代码在
    doStuff
    完成时能够继续执行,它将在适当的时间调用回调

    另一种情况看起来更像#2,其中,
    doStuff
    获取一段可执行代码以获取其自身执行所依赖的值。这方面的经典示例是
    Array.prototype.sort

    [5, 1, 7, 3].sort((a, b) => b - a)
    

    此回调将填充
    排序算法的一部分。它与异步执行无关,不能转换为
    async
    /
    wait
    /
    。然后
    ,也不需要。并非所有回调都用于执行异步任务。并不是所有回调的使用都可以重构为承诺。这就是这样一种情况。@deceze是正确的-这看起来不像异步代码。这只是一系列应该是同步的操作——调用
    foo()
    ,然后将结果传递给
    callbackFn
    ,最后调用
    baz
    ,并给出结果。三个步骤只能按顺序运行。您给出的示例并不完全是异步回调。请给我们看看你的真实密码好吗?
    baz
    做什么,回调返回的
    bar
    值是什么?当您只需等待它时,为什么要将它转换为异步?这段代码与OP的代码之间的唯一区别是添加了多余的东西,从而在其上添加了更多多余的语法。如果
    callbackFn
    是同步的,那很好-为什么需要异步?这里的问题是“如何将函数转换为异步”,而不是该函数是否保证异步转换。“await”关键字告诉程序将函数的处理交给线程,这样就不会让用户等待实现。“wait”只能在异步函数上使用,因此,您必须转换为异步函数。但这是无用的。如果真的需要转换(我不确定是否需要),那么您需要做的全部工作就是使
    doStyff
    异步。就这样。让代码库中的每一个函数都是异步的,这是一个糟糕的设计,原因还有很多。然而,这一切又回到了过去——它是无用的。这充其量只是一种误导,否则就是一种货物崇拜。异步/等待的概念从一开始就存在于C#中。Javascript是最近才实现的,我很高兴他们实现了!它让编码变得很棒,就像真的很棒一样!但随之而来的是必要的变化。这就是为什么Node.js版本8包含一个名为util.promisify()的实用程序,它使开发人员能够轻松地将遗留同步代码转换为返回承诺并与async和await一起使用的代码。并非所有函数都需要它,只有阻塞函数需要它。