2011-04-06 160 views
0

我的問題是在代碼中更好地解釋:的Javascript異步回調

//This code is triggered before ajax ObBegin. But I need f1 to return a boolean to either cancel or continue the event. 
f1(); 

function f1(){ 
    $.modalWindow.Open(); //This is an async method, this is where my problem lies. 
    //I need to freeze here and wait on a return value from one of the events below. 
} 

//In the modal window: 

//An event which waits for the click event 
$('.cancelBtn').click(function(){ 
    //How do I send false back to f1? 
    closeModalWindow(); 
}); 

$('.yesBtn').click(function(){ 
    //How do I send true back to f1? 
    closeModalWindow(); 
}); 

所以基本上會發生什麼情況是這樣的:

  1. openModalWindow()打開一個按鈕上點擊等待一個模態窗口。
  2. 我想將值傳回給f1並返回它。

有沒有辦法解決這個問題?

+1

你意識到'f2'實際上並不返回任何東西? – 2011-04-06 02:53:10

+0

@Matt Ball,我知道,因爲我不知道如何從異步函數返回某些東西。 – 2011-04-06 03:16:53

+0

你不這樣做 - 你運行一個回調函數(像@ Alex的回答)或者像'jQuery.Deferred'(我的回答)這樣的發燒友。但是你的問題還不清楚 - 你能告訴我們更多的代碼嗎? – 2011-04-06 03:35:48

回答

0

沒有好的方法來做到這一點,沒有。你將不得不重構f1,以便它可以處理異步性。

2

使用jQuery的Deferred objects。有一個很好的教程here,但你實際上沒有展示足夠的自己的代碼來演示如何使用$.Deferred進行連接。


下面是一個非常基本的演示:http://jsfiddle.net/mattball/fNQ8J/。基本上,你必須通過回調來執行異步執行。

function openModalWindow(callback) { 
    if (typeof callback !== 'function') callback = $.noop; 
    $("#dialog-confirm").show().dialog({ 
     resizable: false, 
     modal: true, 
     buttons: { 
      Yes: function() { 
       $(this).dialog("close"); 
       callback(true); 
      }, 
      No: function() { 
       $(this).dialog("close"); 
       callback(false); 
      } 
     } 
    }); 
} 

function f1() { 
    return $.Deferred(function(dfd) { 
     openModalWindow(dfd.resolve); 
    }).promise(); 
} 

$('#clickme').click(function() { 
    f1().then(function(result) { 
     alert('f1 async returned: ' + result); 
    }); 
}); 
+0

'click'的最後一個代碼塊應該是一個ajax請求的'OnBegin',它正在監聽返回值true或false。 – 2011-04-06 20:16:29

+0

好的 - 這能解決你的問題嗎? – 2011-04-06 20:23:45

+0

不幸的是沒有:(.ajax請求無論如何發送,因爲f1是異步的,並沒有返回一個真/假(它應該告訴'OnBegin'是否發送查詢 – 2011-04-06 20:33:40

0

f1()應該被實現爲someAsyncFunc()回調:

function someAsyncFunc(callback) { 
    // open your modal window 
    $(".theBtm").click(function() { 
     // do your stuff 
     if (typeof(callback) === "function") { 
     callback(theValueYouWantToPass); 
     } 
    }); 
} 

調用是這樣的:

someAsyncFunc(function(value) { f1(value); }); 
+0

f1()是由一個事件觸發的 – 2011-04-06 03:19:18