为什么此回调无法正常运行?

时间:2020-08-10 14:57:04

标签: javascript node.js

我是编码方面的菜鸟。我真的很抱歉。我在这里有这段代码。...

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和其他东西),但是我想首先学习这种方法。

你们能帮我吗?

3 个答案:

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