Javascript异步回调

时间:2011-04-06 02:48:55

标签: javascript jquery

我的问题在代码中有更好的解释:

//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并将其返回。
  3. 有没有办法解决这个问题?

3 个答案:

答案 0 :(得分: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);
    });
});

答案 1 :(得分:0)

没有好办法做到这一点,不。你必须重构f1才能处理异步性。

答案 2 :(得分: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); });