javascript - each、ajax、promise 并以正确的方式设置 html

标签 javascript jquery ajax

在(动态生成的)表中,我搜索并找到名为“VATNumber”的列,并使用值(增值税号)作为 ajax 调用的参数,迭代该列的所有(非标题)单元格。

表格和按钮:

<table id="ResultData">
    <tbody>
        <tr>
            <th>ID</th><th>Amount</th><th>VATNumber</th><th>Country</th>
        </tr><tr>
            <td>1</td><td>10000.00</td><td>DE123456789</td><td>BE</td>
        </tr><tr>
            <td>2</td><td>20000.00</td><td>NL000123456B01</td><td>BE</td>
        </tr><tr>
            <td>3</td><td>30000.00</td><td>NL001234567B01</td><td>BE</td>
        </tr><tr>
            <td>4</td><td>40000.00</td><td>NL002345678B01</td><td>BE</td>
        </tr>
    </tbody>
</table>

<p>
    <button id="btnVIESCheck">CHECK</button>
</p>

这或多或少是使用(讨厌的)同步ajax(术语上的矛盾)的代码

$('#btnVIESCheck').on('click', function (e) {
    e.preventDefault();
    var columnIndex = $('#ResultData th:contains("VATNumber")').index();
    $('#ResultData tr:gt(0) td:nth-child(' + (columnIndex + 1) + ')')
      .each(function () {
        $this = $(this);
        var vatnr = $this.text(),
            rowIndex = $this.closest('tr').index();

        //add ajaxloader
        $this.html($this.html() + '&nbsp;' + ajaxloader);

        var resultCode = checkVATNr(vatnr),
            img = '';

        switch (resultCode) {
            case '1':
                img = '<img src="Img/ok.jpg" />';
                break;
            case '2':
                img = '<img src="Img/notok.jpg" />';
                break;
            case '3':
                img = '<img src="Img/warning.jpg" />';
                break;
            default:
                break;
        }

        $this.html(vatnr + ' ' + img);
    });
});

function checkVATNr(vatnr) {
    var result = '';

    $.ajax({
        type: "POST",
        async: false,
        url: 'MyWebService.asmx/CheckVATNumber',
        contentType: "application/json; charset=utf-8",
        dataType: 'json',
        data: JSON.stringify({
            'vatnr': vatnr
        }),
        success: function (msg) {
            var xml = $.parseXML(msg.d);
            $xml = $(xml);
            result = $xml.find('ResultCode').text();
        },
        error: function (e) {
            console.log("Error " + e.error);
        }
    });

    return result;
}

当然

  • 这显示所有调用完成后的图像。不太好,表格可能会很大
  • 我想在 .each() 中使用正确的异步 ajax,但有时结果会出现乱码、无序、替换错误的表格单元格,有时它只适用于最后一个单元格。

如何使用 Promise 来编写此内容?

最佳答案

一个问题是在每个循环中使用全局变量$this,这将导致$this始终引用最后一个td 元素。因此,使用将其定义为局部变量,例如 var $this = $(this);

这是因为使用了async:false,它会阻止浏览器线程执行任何操作,直到所有 ajax 请求完成为止。

使用回调机制来处理请求,例如

$('#btnVIESCheck').on('click', function (e) {
    e.preventDefault();
    var columnIndex = $('#ResultData th:contains("VATNumber")').index();
    $('#ResultData tr:gt(0) td:nth-child(' + (columnIndex + 1) + ')')
        .each(function () {
        var $this = $(this);
        var vatnr = $this.text(),
            rowIndex = $this.closest('tr').index();

        //add ajaxloader
        $this.html($this.html() + '&nbsp;' + ajaxloader);

        checkVATNr(vatnr, function (resultCode) {
            var img = '';
            switch (resultCode) {
                case '1':
                    img = '<img src="Img/ok.jpg" />';
                    break;
                case '2':
                    img = '<img src="Img/notok.jpg" />';
                    break;
                case '3':
                    img = '<img src="Img/warning.jpg" />';
                    break;
                default:
                    break;
            }

            $this.html(vatnr + ' ' + img);
        })

    });
});

function checkVATNr(vatnr, callback) {
    $.ajax({
        type: "POST",
        url: 'MyWebService.asmx/CheckVATNumber',
        contentType: "application/json; charset=utf-8",
        dataType: 'json',
        data: JSON.stringify({
            'vatnr': vatnr
        }),
        success: function (msg) {
            var xml = $.parseXML(msg.d);
            $xml = $(xml);
            callback($xml.find('ResultCode').text());
        },
        error: function (e) {
            console.log("Error " + e.error);
            callback('');
        }
    });
}

另请参阅:How do I return the response from an asynchronous call?

关于javascript - each、ajax、promise 并以正确的方式设置 html,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28427152/

相关文章:

javascript - Jquery 焦点不适用于光滑 slider

jquery - 使用 $.get 来操作数据是一个坏主意吗?

javascript - AJAX 返回响应,但不将响应中的 HTML 代码附加到 div

javascript - 如何避免或停止多个ajax请求

JavaScript:cloneNode 和 appendChild 未按预期工作

javascript - 通过禁用按钮来防止提交,直到选择一个值

javascript - 排序选择选项元素

jquery - Bootstrap轮播并根据当前幻灯片显示不同的文本

javascript - Ajax Html 编辑器不计算使用 ASP.NET C# 的母版页中的字符

javascript - 通过 javascript 添加 HTML