自动回调阶梯创建者

时间:2014-11-24 10:18:22

标签: javascript asynchronous

假设我们有这两个异步函数:

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。我问的是文本级别的代码转换,从提议的原始语法形式到众所周知的异步梯,又名"回调地狱"符号

2 个答案:

答案 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/