gpt4 book ai didi

javascript - 循环和回调 hell

转载 作者:搜寻专家 更新时间:2023-11-01 00:20:32 25 4
gpt4 key购买 nike

假设您有一个包含值列表的数组/对象。让我们说那些 mysql 命令或 url 或文件路径。现在您想遍历所有这些并对每个条目执行一些代码。

for(let i = 0; i < urls.length; i++){
doSthWith(urls[i]);
}

目前没有问题。但是现在假设每个函数都有一个回调并且需要上次执行的结果。例如您从一个网站请求某些东西,并且您希望将此请求的结果用于您的以下请求之一。

for(let i = 0; i < urls.length; i++){
if(resultOfLastIteration.successful){ //or some other result besides the last one
doSthWith(urls[i]);
}
}

现在假设 url(或类似的东西)的长度超过 100。这就是为什么你通常使用循环,所以你不需要将相同的函数写 100 次。这也意味着 Promises 也不会解决这个问题(除了我不知道这个问题),因为你有同样的问题:

doSthWith(urls[0]).then(...
doSthWith(urls[1]).then(... //either put them inside each other
).then(...
doSthWith(urls[i]) //or in sequence
...
).catch(err){...}

无论哪种方式,我都看不到使用循环的方法。

我发现但不是真正“好”的方法是使用包“wait.for”( https://www.npmjs.com/package/wait.for )。但是让这个包棘手的是每次你想使用 wait.for 时启动一个光纤:

 //somewhere you use the function in a fiber Context
wait.for(loopedExecutionOfUrls, urls);
//function declaration
function loopedExecutionOfUrls(urls, cb){
//variables:
for(let i = 0; i < urls.length; i++){
if(someTempResultVar[i-1] === true){
someTempResultVar = wait.for(doSthWith,urls[i]);
} else if(...){...}
}
}

但我不确定这种方法是否真的好,此外你总是必须检查你是否已经将整个东西包装在一个 Fiber 中,所以对于每个具有带有回调函数的循环的函数。因此,您有 3 个级别:lauchFiber 级别、wait.for(loopedFunction) 级别和 wait.for 回调函数级别。 (希望我的表述是可以理解的)

所以我的问题是:你们有没有一个好的方法可以循环抛出回调函数并可以随时使用它们的结果?

good = 易于使用、阅读、高效、非递归...

(如果这个问题很愚蠢,我很抱歉,但我真的很难适应这种异步编程)

最佳答案

如果你想等待 doSthWith 完成后再做同样的事情但是使用 nex url,你必须链接你的 promise ,你可以使用 array.prototype.reduce 这样做:

urls = ["aaa", "bbb", "ccc", "ddd"];

urls.reduce((lastPromise, url) => lastPromise.then((resultOfPreviousPromise) => {
console.log("Result of previous request: ", resultOfPreviousPromise); // <-- Result of the previous request that you can use for the next request
return doSthWith(url);
}), Promise.resolve());

function doSthWith(arg) { // Simulate the doSthWith promise
console.log("do something with: ", arg);
return new Promise(resolve => {
setTimeout(() => resolve("result of " + arg), 2000);
});
}

关于javascript - 循环和回调 hell ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48302502/

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