gpt4 book ai didi

javascript - 如何在递归方法中进行同步调用?

转载 作者:行者123 更新时间:2023-12-02 22:45:04 25 4
gpt4 key购买 nike

我正在尝试运行一个调用并在完成另一个函数之前停止递归函数继续运行。

我尝试使用 Promise,但我只是不明白在 .then() 部分中放入什么作为递归调用。

    const htmlString = '<table><tr><td>Bah</td><td>Pooh</td></tr></table>';
const fragment =
document.createRange().createContextualFragment(htmlString);

function walkTheDOM(node, func) {
func(node);
node = node.firstChild;
while (node) {
walkTheDOM(node, func);
node = node.nextSibling;
}
}

function asynchronousCallWantingtoMakeSynchronous() {
return new Promise((resolve, reject) => {
setTimeout(function() {
return resolve ( console.log("should come before another recursive call"))
}, 0)
});
}

walkTheDOM(fragment, function(node) {
console.log(node)
asynchronousCallWantingtoMakeSynchronous.then(function(){

})
})

实际打印出什么:

    <table>...</table>
<tr>...</tr>
<td>Bah</td>
"Bah"
<td>Pooh</td>
"Pooh"
"should come before Pooh"

我真正想要的是:

    <table>...</table>
"should come before another recursive call"
<tr>...</tr>
"should come before another recursive call"
<td>Bah</td>
"should come before another recursive call"
"Bah"
"should come before another recursive call"
<td>Pooh</td>
"should come before another recursive call"
"Pooh"
"should come before another recursive call"

请记住,setTimeout 只是一个示例,我只是想让异步调用同步。

最佳答案

没有办法使异步函数同步。但是您可以使用 Promisesasync-await 让它感觉更像这样。您可以使用它们来分散您的通话

const htmlString = '<table><tr><td>Bah</td><td>Pooh</td></tr></table>';
const fragment = document.createRange().createContextualFragment(htmlString);

async function asyncWalkTheDOM(node, func, intersperse) {
func(node);
node = node.firstChild;
while (node) {
await intersperse(node)
asyncWalkTheDOM(node, func, intersperse);
node = node.nextSibling;
}
}

async function asynchronousCall(node) {
return new Promise(function (res, rej) {
setTimeout(function() {
console.log("should come before another recursive call")
res(node)
}, 0)
})
}

asyncWalkTheDOM(fragment, function(node) {
console.log(node.nodeName)
}, asynchronousCall)

关于javascript - 如何在递归方法中进行同步调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58436611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com