我有以下Javascript代码。
如果params1.hi不存在,我希望func1执行并保证它不会执行下一节“ if(!param1.hello)”块。我觉得这段代码会有5种可能的结果
无论如何,都不会打印“最后的内容”。 我的假设正确吗?以及我如何保证流程首先*首先执行。 *回调总是在返回之前被调用*最小化执行时间
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({})
答案 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