gpt4 book ai didi

javascript - while 循环中的代码未被执行 JavaScript

转载 作者:行者123 更新时间:2023-11-30 11:02:51 25 4
gpt4 key购买 nike

我正在使用这个 while 循环,但它不工作。我决定使用 Google Chrome 调试器,我看到里面的代码没有被执行。

它始终检查条件,从内部代码的第一行开始,然后再次返回检查条件。

这是一个 NodeJS 服务器,我正在使用 Spotify API。

app.get('/process', ensureAuthenticated, function (req, res) {
let init_array = text.split(" ");
let modtext = init_array;

while (init_array.length != 0) {
spotifyApi.searchTracks(modtext.join(" "))
.then(function (data) {
try {
console.log(data.body.tracks.items[0].name);
for (let i = 0; i < modtext.length; i++) {
init_array.shift();
}
modtext = init_array;
} catch (err) {
console.log("No song");
modtext.pop();
}
});
}


res.redirect('/');
});

最佳答案

通过了解 node.js 如何使用事件循环可以最好地理解这个问题。 node.js 的核心是在单线程中运行您的 Javascript,它使用事件循环来管理单线程之外的事情的完成,例如计时器、网络操作、文件操作等...

让我们首先从一个非常简单的 while() 循环开始:

let done = false;

setTimeout(() => {
done = true;
}, 100);

while(!done) {
// do whatever you want here
}
console.log("done with while loop"); // never gets called

乍一看,您会认为 while 循环会运行 100 毫秒,然后 done 会被设置为 true 而 while循环将退出。事实并非如此。实际上,这是一个无限循环。它运行、运行、运行,变量 done 永远不会设置为 true。最后的 console.log() 永远不会运行。

它有这个问题是因为 setTimeout() 是一个异步操作,它通过事件循环来传达它的完成。但是,如上所述,node.js 将其 Javascript 作为单线程运行,并且仅在该单线程完成其正在执行的操作时才从事件循环中获取下一个事件。但是,在 done 被设置为 true 之前,while 无法完成它正在做的事情,但是 done 可以在 while 循环结束之前,它会被设置为 true。这是一个僵局,while 循环会一直运行下去。

因此,简而言之,在运行任何类型的循环时,没有任何异步操作会处理其结果(除非它在循环内使用 await,这是不同的)。异步操作(或任何使用事件循环的操作)必须等到当前运行的 Javascript 完成,然后解释器才能返回事件循环。


您的 while 循环有完全相同的问题。 spotifyApi.searchTracks() 是一个返回 promise 的异步操作,所有 promise 都通过事件队列传递它们的结果。所以,你有同样的僵局。您的 .then() 处理程序在 while 循环完成之前无法调用,但是您的 while 循环在 之前无法完成>.then() 处理程序被调用。您的 while 循环将无限循环,直到您耗尽一些系统资源并且您的 .then() 处理程序永远没有机会执行。


由于您没有在请求处理程序中包含实际产生某些结果或操作的代码(它似乎所做的只是修改一些局部变量),因此您想要完成什么以及如何完成并不明显最好写这段代码。

您似乎有 N 次搜索要执行,并且您在每次搜索中都记录了一些内容。您可以并行执行所有操作,只需使用 Promise.all() 来跟踪它们何时全部完成(根本没有 while 循环)。或者,您可以对它们进行排序,以便运行一个,获得结果,然后再运行另一个。您的问题没有为我们提供足够的信息来了解最佳选择。

这是一种可能的解决方案:

使用 async/await 对操作进行排序

此处请求处理程序被声明为async,因此我们可以在while 循环中使用await。这将暂停 while 循环并允许处理其他事件,同时等待 promise 解决。

app.get('/process', ensureAuthenticated, async function (req, res) {
let init_array = text.split(" ");
let modtext = init_array;

while (init_array.length != 0) {
try {
let data = await spotifyApi.searchTracks(modtext.join(" "));
console.log(data.body.tracks.items[0].name);
for (let i = 0; i < modtext.length; i++) {
init_array.shift();
}
modtext = init_array;
} catch (err) {
console.log("No song");
modtext.pop();
}
}
res.redirect('/');
});

关于javascript - while 循环中的代码未被执行 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56916549/

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