2013-09-28 51 views
1

線執行這個問題之前,我已經認爲我已經掌握了JavaScript的..但沒有,甚至還沒有接近:)的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(); 

這將輸出:

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 

顯然在哪裏最後兩句是太多了......我會want't是做回調有道在以下scenarion ..我想:

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

其中一期工程,以及:

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

其中一期工程太多,但他們都感覺不對的解決方案,我..如何正確地做到這一點?謝謝!

回答

4

這可能是個問題,但return callback()通常是標準。您可以在節點源中看到它以這種方式使用。從文件系統模塊例如:

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(); 
}); 
+0

好吧,太棒了:) - 它只是覺得有點荒謬,我認爲這是我自己愚蠢的發明,嘗試「返回回調();」 - 如果沒有關於這個問題的更多意見,我很快就會接受,thnx! –

+0

據我所知,沒有任何官方文檔(儘管您可以將官方Node源代碼作爲應該如何使用的體面指標)。但是,'return'要麼是提供結果值,要麼是功能的突破。爲返回值創建一個新的範圍沒有任何作用,所以你可以假設'return callback()'是完成你要求的最好的方法。 – hexacyanide

+0

現在我修改了我的資源來使用它,它看起來並不壞,我用這個來滾動。 –

0

如果你不想執行的代碼在調用您的回調後,就是不放置任何那裏。如果您在調用回調函數後沒有發出console.log聲明,則不會發生任何事情:您的函數只會返回。

+0

那麼你如何編碼問題的情況下..如果我有50行以下如果價值是假的做別的事情?我可以做,如果和其他塊,讓代碼在回調後繼續,但我認爲它是醜陋的代碼。 –

+0

'if(something){callback();} else {/ * do something else * /}'有什麼問題。回調沒有什麼神奇的 - 它只是一個功能。我很抱歉 - 我在這裏沒有看到問題。 – 2013-09-28 22:28:26

+0

這個問題與「if else」編程風格無關,而是關於適當回調的行爲。我已經使用if(condition){return something; }/*做一些沒有塊的東西* /返回一些東西;由於斷開的回調,現在停止的時間太長了;) –