JavaScript:回调不会停止执行下面的行

Mau*_*ähä 1 javascript ajax callback node.js requirejs

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

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

请参阅以下示例:

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();
Run Code Online (Sandbox Code Playgroud)

这将输出:

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
Run Code Online (Sandbox Code Playgroud)

显然最后两行是太多了......我想要的是在下面的方案中做回调的正确方法..我试过:

if (true) {
    console.log("Second interval ended.. GOOD");
    return callback(true);
}
Run Code Online (Sandbox Code Playgroud)

哪个有效,并且:

if (true) {
    console.log("Second interval ended.. GOOD");
    return function() {
       callback(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

hex*_*ide 5

这可能是一个意见问题,但return callback()通常是标准.您可以在Node源中看到它以这种方式使用.来自filesystem模块的示例:

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();
});
Run Code Online (Sandbox Code Playgroud)