我的问题在代码中有更好的解释:
//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();
});
所以基本上会发生这样的事情:
openModalWindow()
打开一个等待按钮点击的模态窗口。有没有办法解决这个问题?
答案 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); });