1

我有 2 个相互关联的功能 .._confirm_process. _confirm负责返回true/false_process并基于响应_process函数将采取行动并处理投标。

但问题是: 内部_process正在_confirm返回undefined而不是显示布尔值,因为它在数据来自之前继续前进_confirm

注意* 使用 jquery-confirm-3 库进行警报/确认

<script type="text/javascript">

/* Extra confirmation message on place bid */
function _confirm( formname, id_Bid ) {

    var response = '';

    /* Get bid value, format value and then add to confirm message */
    var bidval = jQuery(id_Bid).val();
    var bidval = parseFloat(bidval);

    if ( bidval > 0 ) {

        var floatbidval = bidval.toFixed(2);
        var currencyval = "$";
        var finalval = currencyval + floatbidval;

        if( formname == 'custom' ) {
            var confirm1 = 'Do you really want to bid';
        } else if( formname == 'direct' ){
            var confirm1 = 'Do you really want to directly place this bid';
        }

        let confirm_message = confirm1 + ' ' + finalval + ' ?';

         $.confirm({
            title: false,
            content: confirm_message,
            onAction: function( btnName ) {
                response = btnName;
            },
            buttons: {
                confirm: function () {},
                cancel: function () {}
            }
        });

        if( response != 'confirm' ) {
            event.preventDefault();
            return false;
        } else{
            return true;
        }
    }

} /* end of function - _confirm() */

function _process( formname, id_Bid ) {

    <?php
    $enable_bid_place_warning = get_option('uwa_enable_bid_place_warning');
    $placebid_ajax_enable = get_option('woo_ua_auctions_placebid_ajax_enable');

    /* using page load */
    if( $placebid_ajax_enable == 'no' || $placebid_ajax_enable == '' ) {
        if( $enable_bid_place_warning  == 'yes' ) { ?>
            $data = _confirm( formname, id_Bid ); <?php
        }
    } elseif ( $placebid_ajax_enable == 'yes' ) { /* using ajax */
        if( $enable_bid_place_warning  == 'yes' ) { ?>

            retval = _confirm( formname, id_Bid );

            if( retval == true ) {
                place_ajax_process( formname );
            } <?php
        } else { ?>
            place_ajax_process( formname );
        <?php
        }
    }
    ?>

} /* end of function */
</script>

后来在这里研究,我找到了几个使用.Deferred()和返回承诺的答案..但承诺也在返回unidentified

后来我做了以下更改,但仍然没有运气

    function _showConfirmDialog( message ) {
        let def = $.Deferred();
        $.confirm({
            title: false,
            content: message,
            onAction: function( btnName ) {
                def.resolve(btnName);
            },
            buttons: {
                confirm: function () {},
                cancel: function () {}
            }
        });
        def.promise();
    }

    /* Extra confirmation message on place bid */
    function _confirm( formname, id_Bid ) {

        var response = '';

        /* Get bid value, format value and then add to confirm message */
        var bidval = jQuery(id_Bid).val();
        var bidval = parseFloat(bidval);

        if ( bidval > 0 ) {

            var floatbidval = bidval.toFixed(2);
            var currencyval = "$";
            var finalval = currencyval + floatbidval;

            if( formname == 'custom' ) {
                let confirm1 = 'Do you really want to bid';
            } else if( formname == 'direct' ){
                let confirm1 = 'Do you really want to directly place this bid';
            }

            let confirm_message = confirm1 + ' ' + finalval + ' ?';

            $.when(_showConfirmDialog(confirm_message)).then(function( response ) {
                if ( response == 'confirm' ) {
                    return true;
                } else {
                    return false;
                }
            });
        }

    }

我也尝试使用 async 和 await 但没有运气。

4

2 回答 2

1

您的第二次尝试即将完成,但_showConfirmDialog()需要返回 Promise。它目前返回undefined.

您还应该考虑利用 promise 的已解决状态(已解决/已拒绝)而不是使用btnName. 因此代码更独立于自然语言。

你可能会写:

function _showConfirmDialog(message) {
    return $.Deferred(function(dfrd) {
    ^^^^^^
        $.confirm({
            'title': false,
            'content': message,
            'buttons': {
                'confirm': dfrd.resolve, // resolve on confirm
                'cancel': dfrd.reject // reject on cancel
            }
        });
    }).promise();
}

同样,_confirm()也应该返回 promise 以便让调用者了解对话的结果。

你可能会写:

function _confirm(formname, id_Bid) {
    var bidval = parseFloat(jQuery(id_Bid).val());
    if (bidval > 0) {
        if (formname == 'custom') {
            let confirm1 = 'Do you really want to bid';
        } else if (formname == 'direct') {
            let confirm1 = 'Do you really want to directly place this bid';
        } else { // unconditional else
            // what if formname is neither 'custom' nor 'direct'
        }
        return _showConfirmDialog(`${confirm1} $${bidval.toFixed(2)} ?`);
        ^^^^^^
    }
}

因此,_confirm()返回一个承诺,如果用户单击“确认”,则该承诺将解决;如果用户单击“取消”,则该承诺将被拒绝(而不是解决真|假)。

jQuery.confirm()注意:除非有令人信服的理由需要 jQuery Promise,否则最好使用原生 JS Promise进行 Promisify 。

你可能会写:

function _showConfirmDialog(message) {
    return new Promise(function(resolve, reject) {
    ^^^^^^ ^^^^^^^^^^^
        $.confirm({
            'title': false,
            'content': message,
            'buttons': {
                'confirm': resolve, // resolve on confirm
                'cancel': function() { // reject on cancel
                    reject(new Error('confirm dialog cancelled'));
                }
            }
        });
    });
}

因此,_confirm()(如上)也将返回一个原生 Promise。

于 2021-07-18T19:39:07.233 回答
0

你是对的@Roamer-1888

并且我将强加您在代码中应用的更改,任何我想在您发布之前显示我在代码中所做的更改的人

function _showConfirmDialog( message ) {
    let def = $.Deferred();
    $.confirm({
        title: false,
        content: message,
        draggable: false,
        theme: 'modern',
        // icon: 'dashicons dashicons-format-chat',
        boxWidth: '30%',
        useBootstrap: false,
        onAction: function( btnName ) {
            def.resolve(btnName);
        },
        buttons: {
            confirm: function () {},
            cancel: function () {}
        }
    });
    return def;
    ^^^^^^^^^^
}

以前我回来def.Promise()了,这导致了这个问题。那么当我使用这个功能时,我awaited

async function confirm_bid( formname, id_Bid ) {
^^^^^
    ... (code block)
    
    await _showConfirmDialog(confirm_message).then(function (res) {
    ^^^^^
        if ( res == 'confirm' ) {
            response = true
        } else {
            response = false;
        }
    });
}

最后,在我使用confirm_bid()函数的地方,我添加了异步等待

async function bid_process( formname, id_Bid ) {
^^^^^

    ...( other code )

    retval = await confirm_bid( formname, id_Bid );
             ^^^^^
    if( retval == true ) {
        /* bid using ajax if confirm yes */
        placebid_ajax_process( formname );
    }

    ...( other code )
    
}
于 2021-07-20T07:53:15.507 回答