2014-04-13 60 views
6

我知道我可以使用外部變量來識別外部函數需要處理的某些狀態。但考慮一下:如果內部函數是異步的?外層函數不會等待內層函數的變量會改變,那麼我現在怎麼才能返回外層函數呢?JavaScript:如何在異步內部函數中返回外部函數?

function outer() { 
    var flag = true; 
    // For example, a jquery-like ajax call 
    $.ajax({ 
     // Some settings 
     error: function(jqXHR, textStatus, errorThrown) { 
      // Here I want to return outer() 
      flag = false; 
     } 
    }); 
    return flag; 
} 

所以你可以看到,如果我用flag作爲返回值,outer()很可能會迴歸真實的,因爲Ajax調用可能需要很長的時間。出於同樣的原因,我不想設置async: false,因爲這會停止頁面反應。

+1

這對於異步流程是不可能的,我建議你在ajax請求完成時調用'outer(cb)'作爲參數添加一個回調方法。 – olsn

+0

是的你是對的,我想錯了。 – Melkor

回答

6

您的outer函數將立即返回,所以您將永遠得到true作爲flag的值。爲了獲得正確的價值,你需要讓異步函數完成它的工作,並在準備好時回覆你。試想一下:

function outer(cb) { 
    var flag = true; 
    // For example, a jquery-like ajax call 
    $.ajax({ 
     // Some settings 
     error: function (jqXHR, textStatus, errorThrown) { 
      // Here I want to return outer() 
      flag = false; 
      cb(flag); 
     }, 
     success: function() { 
      flag = true; // or whatever value you need. 
      cb(flag); 
     } 
    }); 
} 

function callback(flag) { 
    // this function will be called after the ajax is complete. 
    // real value of flag variable will be available here 
    console.log(flag); 
} 
outer(callback); 

你傳遞一個函數作爲參數傳遞給外部函數,當阿賈克斯完成你所需要的參數值調用該函數。這樣你會得到真正的結果。

+0

謝謝,但我實際上需要立即將其退回。現在我意識到它與'async:false'相同。所以我會找到其他方法。 – Melkor

相關問題