如何调用进行ajax调用的异步函数[duplicate]

How to call async function that makes an ajax call [duplicate]

提问人:IncredibleHLK 提问时间:12/25/2021 更新时间:12/25/2021 访问量:326

问:

我已经看到了很多关于如何使用回调和等待的建议,以使我的异步 ajax 调用同步,但我没有成功。我有一个转折点。进行 ajax 调用的函数本身是异步的。以下是我使用回调的尝试。没有错误,但在 for/loop 中不会向控制台写入任何内容。此功能的目的是提示用户选择一个或多个文件,将其导入 SSRS,并使用表示新文件的新节点更新树控件。导入有效,并且从 ajax 调用(新节点 id)返回的数据是有效的,但是当我尝试使用它时它会丢失。任何帮助将不胜感激。

async function readText(event, multiple, data) {
    var fileinfo = new Object();
    fileinfo.Name = event.name;
    fileinfo.Path = '/' + fullpath;
    fileinfo.Replace = !multiple;
    fileinfo.Id = selectedId;

    array = new Uint8Array(await event.arrayBuffer());

    fileinfo.Content = btoa(
        new Uint8Array(array)
            .reduce((data, byte) => data + String.fromCharCode(byte), '')
    );

    $.ajax(
    {
        url: '/ABIReportsSSRS/ImportToSSRS',
        type: 'POST',
        data: fileinfo,
        success: function (data) {
            return data;
        },
        error: function (request, status, error)
        {
            displayErrorMessage(request);
        }
    });
}

function importData(multiple) {
    input = document.createElement('input');
    input.type = 'file';
    input.multiple = multiple;

    var treeviewObj = document.getElementById('tree').ej2_instances[0];

    input.onchange = _ => {
        var newNode = [];

        for (var i = 0; i < event.target.files.length; i++) {
            readText(event.target.files.item(i), multiple, function (data) {
                console.log(data);
                newNode[i] = { Id: data, Name: event.target.files.item(i).name, Type: 'Resource', Image: '../../images/FA-file.png' }
            });
        }

        if (multiple) {
            treeviewObj.addNodes(newNode, selectedId, null);
        }
        else {              
            treeviewObj.updateNode(selectedId, event.target.files.item(i).name)
        }
    };

    input.click();
}
JavaScript Ajax 异步 回调

评论

0赞 Quentin 12/25/2021
您已将其定义为 ,这毫无意义,因为您从未在其中使用过。(你可以将 的返回值用作 promise,但你不能这样做,而是传递回调)。readTextasyncawait$.ajax
0赞 Quentin 12/25/2021
您传递给的回调是没有意义的,因为 jQuery 从不对 success 函数的返回值执行任何操作。success$.ajaxreturn data
0赞 Quentin 12/25/2021
您正在读取 在处理 HTTP 响应和调用回调之前的值。newNode
0赞 Quentin 12/25/2021
您将回调函数作为第三个参数 () ...然后将其视为字符串。readTextdata

答: 暂无答案