进程 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 而不是将其放在窗口中,但无论如何行为都是相同的。每条记录都记录为未定义,并且远在承诺解决之前。承诺解决后,我可以看到每笔交易中的数据。
我对异步编程比较陌生,所以我可能遗漏了一些明显的东西。您能提供的任何帮助将不胜感激,并将大大帮助我理解这种范式。