为什么我的Javascript回调没有定义?
在HTML文档中,加载页面时会运行脚本,JS会定义一系列链接在一起的函数,只要上一个函数为什么我的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
完成
,就会调用所有函数。我对这个例子有很多问题:
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(){
返回新承诺(功能(解决、拒绝){
//现在,您可以:
//返回解析('数据')
//返回拒绝(新错误(“我的错误消息”))
});
}
通过返回承诺,您现在可以使用正常的回调hellf1()
返回未定义的
,您希望它是一个承诺,您的函数不会返回任何内容。但是你要求结果完成那么我需要返回什么?你需要返回一个承诺。或者使那些异步函数
,在这种情况下,它们将隐式返回一个承诺。但是,由于您没有任何异步功能,我不知道您为什么要在此处链接.done
。然后从该DB调用返回承诺(很可能是承诺,否则您可以自己转换)或者使用async
/await
来实现那些基本上等价的函数,但您可能更喜欢在任何地方都使用await
。谢谢,当然可以,但在我的上下文中,我必须异步,因为f
s正在调用一个数据库。我需要jQuery来实现Promise.resolve()
?为什么then
而不是done