为什么我的Javascript回调没有定义?

为什么我的Javascript回调没有定义?,javascript,Javascript,在HTML文档中,加载页面时会运行脚本,JS会定义一系列链接在一起的函数,只要上一个函数完成,就会调用所有函数。我对这个例子有很多问题: 为什么f1未定义 我是否应该能够在callbackinit中定义函数f1,…,f4,以免污染全局命名空间 我应该能够定义函数吗 callbackinit之后的JS文档中的f1,…,f4 var f1=function(){console.log(“Running f1”);} var f2=function(){console.log(“Running f2

在HTML文档中,加载页面时会运行脚本,JS会定义一系列链接在一起的函数,只要上一个函数
完成
,就会调用所有函数。我对这个例子有很多问题:

  • 为什么
    f1
    未定义
  • 我是否应该能够在
    callbackinit
    中定义函数
    f1
    ,…,
    f4
    ,以免污染全局命名空间
  • 我应该能够定义函数吗
    callbackinit
    之后的JS文档中的
    f1
    ,…,
    f4
  • var f1=function(){console.log(“Running f1”);}
    var f2=function(){console.log(“Running f2”);}
    var f3=function(){console.log(“Running f3”);}
    var f4=function(){console.log(“Running f4”);}
    函数callbacksInit(){
    函数start(){
    f1()
    .完成(f2)
    .完成(f3)
    .完成(f4);
    }
    start();
    }
    
    异步回调
    
    您正在调用基本上返回void的
    f1()
    ,它不返回任何内容,然后您尝试访问函数
    done()
    它,但由于返回值未定义,因此它没有任何内容

    我们这里不是在谈论异步函数或其他任何东西,一个接一个地调用它们有什么不对

    f1()
    f2()
    f3()
    f4()
    
    这就应该做到了,它们不是异步的,所以每一个都将在前一个完成后运行


    这里缺少什么吗?

    函数f1已定义,但对其调用的.done未定义。为了让您一个接一个地实际执行函数(考虑到每个函数中都有一些异步操作),您需要从它们那里返回承诺,一旦函数执行,这些承诺就会得到解决

    也可以使用.then代替.done

    var f1=function(){console.log(“Running f1”);返回Promise.resolve()}
    var f2=function(){console.log(“Running f2”);返回Promise.resolve()}
    var f3=function(){console.log(“Running f3”);返回Promise.resolve()}
    var f4=function(){console.log(“Running f4”);return Promise.resolve()}
    函数callbacksInit(){
    函数start(){
    f1()
    .然后(f2)
    。然后(f3)
    。然后(f4);
    }
    start();
    }
    
    异步回调
    
    函数本身不返回任何内容,因此
    未定义

    const a=()=>{
    控制台日志(“运行f1”);
    }
    //返回“未定义”
    
    const b=()=>{
    控制台日志(“运行f1”);
    返回“b”;
    }
    //返回“b”
    
    顺便说一句没有
    done()
    这样的东西,但是要使用它,您需要使用jQuery,它不在标记中

    您需要返回一个
    Promise
    对象,如

    函数a(){
    返回新承诺(功能(解决、拒绝){
    //现在,您可以:
    //返回解析('数据')
    //返回拒绝(新错误(“我的错误消息”))
    });
    }
    

    通过返回承诺,您现在可以使用正常的回调hell
    f1()
    返回
    未定义的
    ,您希望它是一个承诺,您的函数不会返回任何内容。但是你要求结果完成那么我需要返回什么?你需要返回一个承诺。或者使那些
    异步函数
    ,在这种情况下,它们将隐式返回一个承诺。但是,由于您没有任何异步功能,我不知道您为什么要在此处链接
    .done
    。然后从该DB调用返回承诺(很可能是承诺,否则您可以自己转换)或者使用
    async
    /
    await
    来实现那些基本上等价的函数,但您可能更喜欢在任何地方都使用
    await
    。谢谢,当然可以,但在我的上下文中,我必须异步,因为
    f
    s正在调用一个数据库。我需要jQuery来实现
    Promise.resolve()
    ?为什么
    then
    而不是
    done