2014-01-10 48 views
0

我想用ui.confirm这样下返回值:如何使功能这种情况

if(ui.confirm('content')){ 
    //do something 
}else{ 
    //do something 
} 

UI:

var ui = { 
    confirm:function(content){ 
     //...    
     $(".btn-success").click(function(){ 
      //when I click this button , ui.confirm return true 
     }); 
     $(".btn-warning").click(function(){ 
      //when I click this button , ui.confirm return false 
     }); 
    } 
} 

虽然我有这样的另一个不完整的解决方案:

var ui = { 
    confirm:function(content,callback1,callback2){ 
     //... 

     $(".btn-success").click(function(){ 
      //execute callback1 
     }); 
     $(".btn-warning").click(function(){ 
      //execute callback2 
     }); 
    } 
} 
+1

你不能:使用异步编程模型,而不是反对它。我建议使用[Promises](http://www.html5rocks.com/en/tutorials/es6/promises/)/ A(jQuery [Deferred Objects](http://api.jquery.com/category/deferred-object) /)就足够了)而不是“回调”。 – user2864740

+0

那么,你不能从启动异步操作的函数返回结果。 –

+0

@ user2864740承诺可能对于初学者来说太过于困难。 –

回答

2

您不能返回从confirm一个有意义的值,因为按钮点击是异步。这意味着按钮点击将(可能)在“将来的某个点”发生,但该功能必须“立即返回”。

JavaScript中的解决方案是一旦遇到这种情况,就会使用异步编程模型。虽然callbacks是这种异步操作的构建块,但我更愿意在可以时使用Promises。

如此,因为dystroy不认为我应该;-),我将介绍使用Promises/A的方法(jQuery的1.9+Deferred Objects工作得很好,并提出“免费”使用jQuery)。

function uiConfirm (msg) { 
    var action = $.Deferred(); 

    // Note: On the button clicks the dialog should be closed as a Promise can only 
    // be resolved/rejected once; Promises are really good for execution flow 
    // management (see `then`), but are not as general as simple callbacks. 
    $(".btn-success").click(function(){ 
     action.resolve("okay"); 
    }); 
    $(".btn-warning").click(function(){ 
     // Depending upon semantics, this could `reject` the Promise, but I think 
     // it's cleaner to just resolve it with a different discriminator value 
     // in this case. 
     action.resolve("cancel"); 
    }); 

    // uiConfirm returns immediately (before the clicks), 
    // but returns a Promise/Deferred that can be resolved (or rejected) later 
    // in response to a button click. 
    return action; 
} 

uiConfirm("Do you like Cheese?") 
    .then(function (value) { 
     // This code runs when a button has been clicked 
     alert("Action: " + value); 
    }); 

// This code runs right after uiConfirm returns (before any clicks) 
// because uiConfirm is asynchronous or "non-blocking" 
+1

我认为你不应该提出承诺,你应该,他们会在js世界越来越重要,我认为OP应该被警告今天在浏览器中使用它们不是一件容易的或自然的事情。 –

+0

不容易或自然吗?哇,那是苛刻的战斗词!话虽如此,我完全同意OP应该理解一流的功能和回调(并且能够在没有Promises的情况下使用它们)。 – user2864740

+0

我的意思是在一般情况下(每个人都必须掌握)。当你使用jQuery时,你有他们的承诺系统当然。 –

2

不可能使用异步功能

你需要做的是这样的:

ui.confirm('content', function() { 
    //do something 
}, function() { 
    //do something 
}); 
1

你不能这样做完全一样的。当发生任一点击事件时,您必须提供回调函数以“执行某些操作”。您不能从这些事件“返回”到先前执行的状态。

var ui = { 
    confirm:function(content,callback1,callback2){ 
     $(".btn-success").click(function(){ 
      callback1(); 
     }); 
     $(".btn-warning").click(function(){ 
      callback2(); 
     }); 
    } 
} 

ui.confirm('content', function() { 
    //do something 
    alert("success"); 
}, function() { 
    //do something else 
    alert("WARNING"); 
}) 

例子:http://jsfiddle.net/xvbL5/1/

+1

如果不提供特定的上下文,通常应该使用'fn()'(而不是'fn.call()')。 – user2864740

+0

好吧,我别无选择,只能这样做。感谢 – ZhouMengkang