2015-10-23 333 views
1
function test() { 
    /*some business logic*/ 

    return response; 
} 

function calculate() { 

    if (test() == true) { 
    console.log("Success"); 
    } else { 
    console.log("Fail"); 
    } 
} 

我的測試功能是在不同的js文件,做一些業務的處理(需要一些時間)數據並返回boolean響應。如何使功能響應同步與其他功能的其他語句

我從計算函數調用測試函數(在不同的js文件中)。 我期待控制檯輸出爲'success'(測試函數總是返回true),但它給了我'Fail'。但如果我調試此代碼,並有時在'(if(test()==true))'等待,那麼我得到預期的輸出。基本上它是一個同步問題。我該如何解決這個問題?

+0

JavaScript是異步的。不知道'test()'究竟是在做什麼,人們無法幫助你弄明白。 'test()'是需要工作的位。如果它發出網絡請求等,你真的應該看看承諾或回調,而不是。 JavaScript是單線程的,如果你把它做成同步ajax請求,你會在等待響應時鎖定瀏覽器。 – ste2425

+1

不,javascript是**同步**和單線程。在進行異步請求時,它只是異步的。 –

+0

其真正的丹尼爾.. JavaScript是同步語言..其實問題是用測試方法編寫的業務邏輯..它現在已經解決了。謝謝 –

回答

0

我認爲從上面的代碼,你不會有任何問題,以獲得「成功」路線運行。這取決於您的業務邏輯如何運行。如果它們以異步方式運行,那麼您應該使用事件驅動模型來運行您的計算邏輯。例如,您通過document.addEventListener('testCompleted', caculate())註冊一個活動,然後在test()中發起此活動。

希望它有幫助。

1

我嘗試修改您的代碼以滿足您使用JQuery Deferred對象的需要。 如果你註釋掉「deferred.reject()」,那麼當你的函數被認爲失敗時,你應該得到這種情況。

它會讓你的函數等待另一個函數給出響應。

var test = function(){ 
    var deferred = $.Deferred(); 
    setTimeout(function(){ 
     deferred.resolve(); //deferred.reject(); 
    },3000); 
    return deferred.promise(); 
}; 


test().done(function(){ 
    console.log("success");}) 
     .fail(function(){ 
    console.log("fail");}) 
+0

setTimeout函數只是爲了讓我像普通函數那樣花費一些時間來處理操作 – SerMintt