【问题标题】:JavaScript: Callback which doesn't stop execution of lines belowJavaScript:不会停止执行以下行的回调
【发布时间】:2013-09-28 22:14:53
【问题描述】:

在这个问题之前,我已经认为我已经掌握了 JavaScript.. 但不,甚至没有接近:)

我目前正在使用 require.js 进行编程并尝试使用回调创建方法(因为异步 js),但问题是代码在我的 callback(); 调用之后继续执行。 p>

参见以下示例:

var Second = function () {
    console.log("Second init");
};

Second.prototype.load = function (callback) {

    console.log("Second load");

    var timeOut = setTimeout(function () {

        clearTimeout(this);

        if (true) {
            console.log("Second interval ended.. GOOD");
            callback(true);
        }

        console.log("Second interval ended.. NO, YOU SHOULD NOT BE HERE!");
        callback(false);

    }, 1000);
};

var First = function () {

    console.log("First init");
    var second = new Second();

    second.load(function (returned) {
        console.log("Second returned: " + returned);
    });

};

First();

这将输出:

First init
Second init
Second load
Second interval ended.. GOO
Second returned: true
Second interval ended.. NO, YOU SHOULD NOT BE HERE!
Second returned: false

显然最后两行太多了...我不想要的是在以下场景中进行回调的正确方法..我尝试过:

if (true) {
    console.log("Second interval ended.. GOOD");
    return callback(true);
}

哪个有效,并且:

if (true) {
    console.log("Second interval ended.. GOOD");
    return function() {
       callback(true);
    }
}

这也有效,但对我来说,他们都觉得是错误的解决方案。如何正确地做到这一点?,谢谢!

【问题讨论】:

    标签: javascript ajax node.js callback requirejs


    【解决方案1】:

    这可能是一个见仁见智的问题,但 return callback() 通常是标准。您可以在 Node 源代码中看到它以这种方式使用。来自文件系统模块的示例:

    fs.fstat(fd, function(er, st) {
      if (er) return callback(er);
      size = st.size;
      if (size === 0) {
        // the kernel lies about many files.
        // Go ahead and try to read some bytes.
        buffers = [];
        return read();
      }
    
      buffer = new Buffer(size);
      read();
    });
    

    【讨论】:

    • 好吧,太好了:) - 感觉有点荒谬,我认为尝试“return callback();”是我自己的愚蠢发明- 如果对这个主题没有更多的意见,我会尽快接受,thnx!
    • 据我所知,没有任何官方文档(尽管您可以将官方 Node 源代码视为应该如何使用事物的体面指标)。但是,return 要么用于提供结果值,要么用于中断函数。为返回值创建新范围没有任何效果,因此您可以假设 return callback() 是执行您要求的最佳方法。
    • 现在我修改了我的资源以使用它,它看起来并没有那么糟糕,我继续使用它。
    【解决方案2】:

    如果您不希望在调用回调后执行代码,请不要在此处放置任何代码。如果您在调用回调函数后没有放置console.log 语句,则不会发生任何事情:您的函数将简单地返回。

    【讨论】:

    • 那么你如何对问题案例进行编码......如果我在下面有 50 行来做其他事情,如果 value 为 false 怎么办?我可以做 if 和 else 阻塞并让代码在回调后继续,但我认为它是丑陋的代码。
    • if (something) {callback();} else { /* do something else */ } 有什么问题。回调没有什么神奇之处——它只是一个函数。很抱歉 - 我只是在这里没有发现问题。
    • 这个问题与“if else”编程风格无关,它与正确回调的行为有关。我用过 if(condition) { return something; } /* 在没有块的情况下做其他事情 */ return something;由于回调中断,现在停止的时间太长了;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 2022-01-24
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多