Javascript JS async返回后执行任务
我正在重写一些JavaScript代码,这些代码使用对异步函数的回调。基本上做: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
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;
}
回调函数(主要)用于两个不同的目的:
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一起使用的代码。并非所有函数都需要它,只有阻塞函数需要它。