Javascript回调,在何处放置返回值以防止执行下一个块

时间:2018-06-19 17:36:44

标签: javascript callback

我有以下Javascript代码。

如果params1.hi不存在,我希望func1执行并保证它不会执行下一节“ if(!param1.hello)”块。我觉得这段代码会有5种可能的结果

  1. Hi不存在并在调用回调console.log('do something1')
  2. 之前返回
  3. Hi不存在并在调用回调console.log('do something1')
  4. 后返回
  5. 嗨不存在,但你好也不存在。因此,首先执行hello块,然后在调用回调console.log('do something2')
  6. 之前返回
  7. 嗨不存在,但你好也不存在。因此,请先执行hello块,然后在调用回调console.log('do something2')
  8. 后返回
  9. console.log('做某事1')和console.log('做某事2')都被打印

无论如何,都不会打印“最后的内容”。 我的假设正确吗?以及我如何保证流程首先*首先执行。 *回调总是在返回之前被调用*最小化执行时间

function func1(param1) {
    if (!param1.hi) {
        logging.fire('hi does not exist', () => {
            console.log('do something1');
        });
        return;
    } 
    if (!param1.hello) {
        logging.fire('hello does not exist', () => {
            console.log('do something2');
        });
        return;
    }

    console.log('here is the final');
    return;
}

const logging = {
    fire: (event, callback) => {
        console.log('event fired: ' + event);
        return callback && callback();
    }
}

func1({})

1 个答案:

答案 0 :(得分:0)

让我们再举一个例子。 打印输出是:

> "event fired: hi does not exist"
> "event fired: event in event"
> "event in event fired"
> "do something1"
> "something1 outside"

我不是专家,所以可能不是很精确,但是对于这种并发,当事件被触发时,“上下文”(概念上)将切换到事件的动作。因此,当“ hi不存在”被触发时,回调中的操作将首先执行,然后我们看到它后面是“ event in event”。完成“事件触发事件”的打印输出后,它将返回到“ hi is不存在”的回调,然后返回到原始的“上下文”:func1。 这就是“外面的东西”是最后一个出现的原因。

在回调需要大量时间执行的情况下,我真的不知道。例如,如果语言/环境在挂起当前操作队列的回调中允许诸如“睡眠”之类的操作,则func1可能在所有这些回调之前完成执行。


function func1(param1) {
    if (!param1.hi) {
        logging.fire('hi does not exist', () => {
              logging.fire('event in event',() => {
                   console.log('event in event fired');
             });              
            console.log('do something1');
        });
          console.log('something1 outside');
        return;
    } 
    if (!param1.hello) {
        logging.fire('hello does not exist', () => {
            console.log('do something2');
        });
        return;
    }

    console.log('here is the final');
    return;
}

const logging = {
    fire: (event, callback) => {
        console.log('event fired: ' + event);
        return callback && callback();
    }
}

func1({})

PS:此链接可能会有所帮助。那将解释javascript如何解决问题。 Link