假设我们有这两个异步函数:
function myfu(f) {
setTimeout(function(){ f(true) }, 200)
}
function myfu2(x, f) {
setTimeout(function(){ f(500 + x) }, 200)
}
我正在考虑这种语法:
if (myfu.()) {
var d = myfu2.(55)
console.log(d) // outputs 555
}
输入和读取这个非常简单:
myfu(function (DOTCALL1) {
if (DOTCALL1) {
myfu2(55, function (DOTCALL2) {
d = DOTCALL2
console.log(d) // outputs 555
})
}
})
可以通过搜索/替换/正则表达式轻松实现.(
语法的转换。
我注意到大部分时间都没有使用异步函数的结果,并且在调用之后,上层函数也会立即退出。
虽然有时上层函数在调用第一个async(callback)
后可以执行某些操作,但通常它什么都不做。有时异步函数可以返回一些有用的东西,但大部分时间它只返回undefined
,而实际内容返回callback(result)
。
所以我想也许我可以修改代码,以便更容易输入和阅读。以上示例说明了这一点。
我的问题是sipmle:有没有类似的解决方案?我不想重新发明轮子(如果已经发明了)。或者,如果没有这样的项目,为什么不呢,为什么这种方法似乎很容易实现并且应该显着简化开发呢?
请不要回复建议"看看async.js"。我不是在询问异步编程模式,一般是异步编程,不是关于箭头函数符号=>而不是关于coffeScript。我问的是文本级别的代码转换,从提议的原始语法形式到众所周知的异步梯,又名"回调地狱"符号
答案 0 :(得分:1)
自去年以来,我将这个网站加入了书签,其中作者博客关于EcmaScript6,据说可以让你获得类似于.NET async
/ await
模式的东西(因此允许代码调用异步方法,如" normal" one)。 Here is the link
ES6引入了两种语言语法的小扩展:
function *:用一点点闪烁星形声明的函数是生成器函数。它们以不寻常的方式执行并返回发电机。
yield:此关键字允许您将控件从生成器传输到控制它的函数。
而且,尽管这两种语言结构的设计并非设计为具有其他语言中的async / await语义,但可以为它们提供这些语义:
* in function *是你的异步关键字。
yield是您的等待关键字。
了解这一点,您可以编写异步代码,就像JavaScript具有async / await关键字一样。
我从来没有机会尝试过,所以YMMV。 听起来很有用。
答案 1 :(得分:1)
您所描述的内容与streamline.js非常相似:https://github.com/Sage/streamlinejs。
我写了它,但我从narrative.js得到了这个想法:见http://www.neilmix.com/narrativejs/doc/
所以你的直觉是正确的。这可以做到。然而,它比一些搜索/替换/正则表达式操作稍微复杂一点,至少如果你想要超越所有JavaScript结构中的明显和支持异步调用。例如,尝试重写:
while (asyncF1.() && asyncF2.()) asyncF3.();
我在博文中描述了流线转换算法:https://bjouhier.wordpress.com/2011/05/24/yield-resume-vs-asynchronous-callbacks/