Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
你能等javascript回调吗?_Javascript_Jquery_Dialog_Callback_Confirm - Fatal编程技术网

你能等javascript回调吗?

你能等javascript回调吗?,javascript,jquery,dialog,callback,confirm,Javascript,Jquery,Dialog,Callback,Confirm,我试图使用jQuery警报对话框库,而不是默认警报(在我看来,默认警报非常糟糕)。这似乎是一个很好的库,但是没有一个关于如何使用jConfirm库的示例 我需要这样做: function confirm() { var result = false; var response = false; jConfirm('are you sure?', 'Confirmation Dialog', function(r) {

我试图使用jQuery警报对话框库,而不是默认警报(在我看来,默认警报非常糟糕)。这似乎是一个很好的库,但是没有一个关于如何使用jConfirm库的示例

我需要这样做:

function confirm() {
        var result = false;
        var response = false;
        jConfirm('are you sure?', 'Confirmation Dialog',
          function(r) {
            result = r;
            response = true;
            return r;
        });
        if (response == true) {
            alert(result);
            return result;
        }
        else {
            //wait for response
            alert('hi');
        }
    }
以及我从.net按钮拨打的电话:

我在插件的网站上发表了一条评论(就在今天早上),在谷歌上搜索javascript,等待回调完成,但没有结果

在剩下的javascript执行之前,有没有关于如何正确使用回调来获得结果的想法


谢谢。

我想你应该会像这样得到回应。我想你不需要回电话

function confirm() {
        var response = jConfirm('are you sure?', 'Confirmation Dialog');
        if (response) {
            alert(result);
        }
        else {
            //wait for response
            alert('hi');
        }
    }

由于回调是异步的(至少在等待用户执行某项操作的意义上是如此),因此在回调中处理所需的内容可能更容易:

function confirm() {
    jConfirm('are you sure?', 'Confirmation Dialog', function(r) {
        if (r) doSomething();
    });
}

@克洛甘[评论]

我猜你是从哪里弄来的

该页面给出了您的答案:(在用法下查看)

这些方法返回的值与confirm()和prompt()不同。必须使用回调函数访问结果值。(有关更多详细信息,请参阅演示。)


@克洛根

我想说的一点是,要想实现你的目标,没有一个简单的方法。您正试图将过程性事件驱动的编程关联起来——JavaScript对您没有帮助

最简单的(尽管,有风险的)解决方案是使用伪无限循环。但是,如果
callback
从未被调用,那么现在就有了一个实际的无限循环。而且,根据JavaScript引擎的不同,您可能会终止浏览器的等待

要点:您的最佳选择是避免试图强迫事件驱动进入程序。


从技术上讲,是的,但我不会在网站上这么做

看一看,这是基于

叙述式JavaScript是JavaScript语言的一个小扩展,它支持异步事件回调的阻塞功能。这使得异步代码具有刷新的可读性和可理解性

使用这种技术


更新 退房:

JavaScript增加了协同程序和 对 启用阻塞的JavaScript语言 异步事件的功能 回调。这使得代码 多利用异步操作 更具线性、可读性和可管理性。 故事是建立在叙述的基础上的 由Neil Mix编写的JavaScript,以及 大部分叙述性JavaScript都有 仍然在股中,包括大部分的 这是一份文件

在JavaScript中,您的代码不能简单地 等待直到触发了事件,然后 事件必须始终由 独立的异步事件处理程序。 有时这很好,但经常是这样 强迫应该是简单的 将语句顺序转换为粗糙的 扭曲。它也打破了传统 封装功能的能力 因为调用函数必须知道 提供一个回调处理程序。股 提供挂起和恢复的功能 恢复执行线程。执行 事件发生时可以暂停或恢复 完成了。这让你可以写作 难读异步事件 以简单、线性、可读的方式处理 封装实现的代码

这暴露了对使用异步代码发生的事件序列的误解。仅仅因为您是内联编写的,并不意味着它将严格地从上到下执行

  • 调用jConfirm,接收一个函数作为它的参数之一,它会记住该参数
  • jConfirm在页面上显示其UI并立即返回
  • 执行“if(response==true)”行。实际上,这应该是‘if(response)’,布尔比较是多余的。但无论如何,答案当然是错误的。您的函数放弃并退出,将控制权交还给浏览器
  • 用户单击jConfirm的UI
  • jConfirm现在才开始执行,并调用您提供的函数,它在前面就记住了
  • 您的嵌套函数将response设置为true,对于'if(response==true)'条件来说,对它做任何事情都太迟了
  • 您已经编写了“//wait-for-response”作为替代,但是没有任何JavaScript代码可以真正做到这一点。您的函数必须返回以将控制权交还给浏览器,然后浏览器才能在jConfirm UI上触发使处理继续的单击事件


    使异步代码在同步上下文中工作(反之亦然)的方法是存在的——特别是线程和协程(以及它们的有限关系生成器)。但是JavaScript没有这些特性,所以您必须编写代码以适应库使用的同步或异步模型。

    您刚刚遇到了JavaScript的一个很大限制。一旦代码进入异步世界,就无法回到经典的过程执行流

    在您的示例中,解决方案是创建一个循环,等待响应被填充。问题是JavaScript没有提供任何指令,允许您在不占用100%处理能力的情况下无限循环。因此,您最终会阻塞浏览器,有时您的用户将无法回答实际问题

    这里唯一的解决方案是坚持异步模型并保持它。我的建议是,您应该向任何必须执行异步工作的函数添加回调,以便调用方可以在函数末尾执行某些操作

    function confirm(fnCallback) 
    {
        jConfirm('are you sure?', 'Confirmation Dialog', function(r) 
        {
            // Do something with r 
    
            fnCallback && fnCallback(r); // call the callback if provided
        });
    }
    
    // in the caller
    
    alert('begin');
    
    confirm(function(r)
    {
        alert(r);
    
        alert('end');
    })
    

    我想我已经想出了解决这个问题的可能办法。我在读这篇文章:

    基本上,这个想法是强制从javascript进行回发,起初我发现回发可以工作,但不会调用我的按钮
    jConfirm('are you sure?', 'Confirmation Dialog',
        function(r) {
            result = r;
            response = true;
            return r;
        }
    );
    if (response == true) {
    
    function confirm(fnCallback) 
    {
        jConfirm('are you sure?', 'Confirmation Dialog', function(r) 
        {
            // Do something with r 
    
            fnCallback && fnCallback(r); // call the callback if provided
        });
    }
    
    // in the caller
    
    alert('begin');
    
    confirm(function(r)
    {
        alert(r);
    
        alert('end');
    })
    
    <h:commandLink styleClass="linkValor xExcluir" value="x"  
                         onclick="if(confirmar('Confirmar excluir.','Deseja realmente excluir este registro?', this)) return true; else return false;"
                         action="#{mBeanPesquisarLinhas.excluir}"/>
    
    function confirmar(titulo, msg, elemento) { 
    
        if ($(elemento).attr('sim')) {      
            $(elemento).removeAttr('sim');      
            return true;
        } else if ($(elemento).attr('nao')) {       
            $(elemento).removeAttr('nao');      
            return false;
        } else {
            $("#dialog-confirm").html('<p>' + msg + '</p>').dialog({
                resizable : false,
                height : 200,
                modal : true,
                title : titulo,
                buttons : {
                    "Sim" : function() {
                        $(this).dialog("close");
                        $(elemento).attr('sim', 'sim');
                        $(elemento).click();
                    },
                    "Não" : function() {
                        $(this).dialog("close");
                        $(elemento).attr('nao', 'nao');
                        $(elemento).click();
                    }
                }
            });
        }
    
        return false;
    }
    
    function myconfirm(kyssa, elm, e){ // neG
        if(jQuery('#confirmquestion').data('result')){
            var V = jQuery('#confirmquestion').data('result');
            jQuery('#confirmquestion').remove(); 
            return V == 'Y' ? true : false;         
        }else if(!jQuery('#confirmquestion').length){
            jQuery('body').append('<div id="confirmquestion">'+
            '<h4>Kinnitus</h4>'+
            '<div id="kyssa">'+kyssa+'</div>'+
            '<center>'+
            '<button onclick="jQuery(\'#confirmquestion\').data(\'result\', \'Y\');">Jah</button>&nbsp;'+
            '<button onclick="jQuery(\'#confirmquestion\').data(\'result\', \'N\');">Ei</button></div>'+
            '</center>');
            jQuery('#confirmquestion button').click(function(){
                jQuery(elm).trigger(e.type);
            })
        }       
        return false;
    }
    
    onChange="if(myconfirm(\'Saada kiri: \'+jQuery(this).find(\'option:selected\').html()+\' ?\', this, event)) { ... }"
    
    #confirmquestion{
        border:1px solid #999;
        background:white;
        padding-bottom: 30px;
        position:fixed;
        width:300px;
        font-size:12px;
        top:45%;
        left:50%;
        margin-left:-150px;
    }
    
    #confirmquestion h4 {
        background:blue;
        color:white;
        margin:0;
        padding: 2px 5px;
        border-bottom:#777; 
        text-align:center;
    }
    
    #confirmquestion #kyssa {
        padding: 30px 25px;
    }