我正在尝试开发一个异步迭代器来显示另一个进程正在写入的实时日志

问题描述 投票:0回答:0

进程 A 正在对活动目录服务器进行测试验证。当它完成每个步骤时,它会在 mysql 内存表中存储一个日志条目。

在用户将他们的凭据输入到一个小表格中后,将显示一个新窗口,目的是在进程 A 完成其序列时逐步显示上述日志。

为了从表中获取数据,我使用了一个调用我的 php api 的 await fetch。 API 为每个请求响应一个日志记录,然后从表中删除该记录。我已验证此代码有效。

然后我编写了一个迭代器来运行上面的代码,检索每个单独的记录并将其显示在日志窗口中。使用 Javascript 的“for await of”构造调用迭代器。我可以从开发人员工具的网络选项卡中看到,这些记录的承诺正在得到解决,但是在“等待构造”中,承诺仍在等待中,值为未定义。

正如我之前所说,它们是两个同时运行的等待提取。这是尝试 ldap 身份验证的代码(它没有问题)

let postVars = new FormData();
    postVars.append('action', "40.5");
    postVars.append('username', uname);
    postVars.append('password', password);

    const options = {
        method: 'post',
        body: postVars,
    };
    await fetch('/admin/adminFuncs.php', options).then(result => result.json()).then(result => {
        let message;

        message = 'Error:' + result.err + ' ' + result.errorMessage + ' ';
        message = message + '\n' + result.errorsArray.toString();
        message = message + '\n' + result.rebinds.toString();
        console.log(message);

与活动目录的实际通信发生在 php 中。

现在这里是 await fetch 构造,它调用 api 来检索和删除前一个 api 调用写入的日志的一行。

async function getNextLogEntry() {
    postVars = new FormData;
    postVars.append('action', "40.6");
    const options = {
        method: 'post',
        body: postVars,
    };
    await fetch('/admin/adminFuncs.php', options)
        .then(result => result.json())

正如我所提到的,我开发了一个异步迭代器来从前一个函数中一次获取一个记录。在这里。

const END_OF_LOG = '---';
const asyncLogEntryIterable = {
    [Symbol.asyncIterator]() {
        let i=0;
        return {
            next() {
                i++;
                const done = logLine === END_OF_LOG;
                const value = done ? undefined : getNextLogEntry();
                // return Promise.resolve({value, done});
                return { value, done };
            },
            return() {
                return { done: true};
            }
        }
    }
};

现在是调用这些进程的代码,

    if (event.target.id === 'testAuthenticationButton') {
            submitAuthenticationTest().finally();
            testAuthenticationDiv.style.display = 'none';
            document.getElementById('authenticationLog').style.display = 'block';
            document.getElementById('testAuthentication').style.display = 'none';
            const authenticationLog = document.getElementById('authenticationLog');
            authenticationLog.style.display = 'block';
            authenticationLog.style.borderStyle = '1px solid black';
            // showAuthenticationLog();

            (async () => {
                for await (const x of asyncLogEntryIterable) {
                    console.log(x.logLine);
                }
            })();
        }
    })

现在这段代码正在执行 console.llog 而不是将其放在窗口中,但无论如何行为都是相同的。每条记录都记录为未定义,并且远在承诺解决之前。承诺解决后,我可以看到每笔交易中的数据。

我对异步编程比较陌生,所以我可能遗漏了一些明显的东西。您能提供的任何帮助将不胜感激,并将大大帮助我理解这种范式。

javascript asynchronous async-await es6-promise
© www.soinside.com 2019 - 2024. All rights reserved.