我是编码方面的菜鸟。我真的很抱歉。我在这里有这段代码。...
function fn1(){
setTimeout(function(){console.log("fn1")},3000)
}
function fn2(){
console.log("fn2")
}
function fn3(callback, callback2){
if(callback){
console.log("It works!")
} else {
callback2
}
}
fn3(fn1(),fn2())
此处的目标是仅在Function1(fn1)运行正常之后才调用Function3(fn3)console.log(“有效”)。如果Function1失败,则应返回Function2。
我得到的输出是:
fn2
fn1
我知道这是绝对错误的,但是我不知道哪里出了问题。 我知道还有其他东西(我仍然不知道,例如promise,async,await和其他东西),但是我想首先学习这种方法。
你们能帮我吗?
答案 0 :(得分:2)
您必须在函数上传递引用作为fn3
的参数(您当前调用它们并传递其结果)。
此外,在fn3
中,您需要调用该功能。
您的代码已在下面修复(如果我正确理解了您要查找的内容):
function fn1(next) {
setTimeout(next, 3000);
}
function fn2() {
console.log("fn2")
}
function fn3(callback, callback2){
function itWorks() {
console.log('it works!');
}
try {
callback(itWorks);
}
catch (e) {
callback2();
}
}
fn3(fn1, fn2); // Will display "it works!" after 3 seconds
fn3(undefined, fn2); // Will display "fn2" because trying to call an undefined function
答案 1 :(得分:2)
是的,您是正确的。这真是胡说八道。
如果我错了,请更正我:您希望控制台记录“它有效!”在fn1中设置的超时后。然后,您将需要fn1告诉它完成了执行的方式,以便它可以运行console.log。如果要使用回调方法,则fn1可能类似于:
function fn1(callback, errorCallback) {
setTimeout(function() {
try {
callback();
} catch (error) {
errorCallback();
}
}, 3000);
}
fn3可能会这样:
function fn3() {
fn1(function() { console.log('It works!'); }, fn2);
}
您可以仅使用fn3()
来呼叫fn3。
说实话,由于这些函数非常简单,因此无法调用fn2,因为代码中没有错误,也没有人为干预。好吧,也许如果没有标准输出可用于console.log,但我不知道那是否有可能。
如您所见,在fn3中,我们将两个函数作为参数传递给fn1。第一个是匿名函数,可在输出中显示文本。第二个函数是fn2,在出现错误的情况下应运行该函数。在将它们作为参数传递时,此处没有括号,因为我们要传递函数,而不是调用它们的结果(在本示例中为undefined
)。
fn1接收这些函数作为参数,并在不同情况下运行它们。第一个是超时结束时,第二个是在调用回调时是否有错误。
答案 2 :(得分:0)
我知道您想在成功调用f1之后调用f3,而在f1失败时调用f2吗?如果是,那就看
function fn3(){
console.log("It Works!");
}
function fn2(){
console.log("fn2");
}
function fn1(){
const promisePass = new Promise((resolve, reject) => {
setTimeout(resolve, 100)}); //Emulate success
const promiseFail = new Promise((resolve, reject) => {
setTimeout(reject, 100);});//Emulate fail
promisePass.then(function(){
fn3();
}).catch(function(){
fn2();
});
promiseFail.then(function(){
fn3();
}).catch(function(){
fn2();
});
}
fn1(); //<<-- calling f1 now will pass and fail the setTimeout method and then
// fn2 and fn3 are called accordingly