gpt4 book ai didi

javascript - 无法从异步函数中获取 `count`

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

我有下面的代码,其中 d3.json 是一个异步函数。我试图在我的 count 等于 100 时循环运行它。我的 while 循环在第一次迭代后停止,因为 count发生在异步函数内部,所以我没有尽可能多地运行它。我怎样才能获得正确的计数,以便我的 while 循环在保持异步特征的同时继续执行?

    $(document).ready(function() {
$('button').click(function() {
var start = new Date().getTime();
while(count == 100){
console.log("first iteration");
count = 0;
d3.json("/api/messages/" + offset, function(error, json) {
if (error) return console.warn(error);
data = json;
for(var i = 0; i < data.messages.length; i++){
console.log(data.messages[i].date);
count++;
console.log(count);
}
});
offset += 100;
}
var end = new Date().getTime();
var time = end - start;
console.log("Time to execute : " + time);
});
});

编辑:我正在尝试让我的通话如下所示。在每次调用时,您将检查并确保返回了 100 个项目(计数),如果没有,您将停止 while 循环

  1. /api/messages/0
  2. /api/messages/100
  3. /api/messages/200
  4. /api/messages/300
  5. /api/messages/400
  6. /api/messages/500
  7. /api/messages/600

最佳答案

下面是我的做法:

创建一个接受相关参数的函数:start 偏移量、increment,最重要的是一个应该在最后执行的 done 回调.

此函数包含一个辅助函数,它将调用 API、检查结果并调用自身或 done 回调:

function fetchAllMessages(start, increment, done) {
var messages = [];
(function nextCall(offset) {
d3.json("/api/messages/" + offset, function (error, data) {
if (error) return done(error, messages);
if (!data.messages) return done("unexpected response format", messages);

messages.push.apply(messages, data.messages);
if (data.messages.length === increment) {
nextCall(offset + increment);
} else {
done(null, messages);
}
});
})(start);
}

现在您可以简单地从您的点击事件处理程序中使用它:

$(function() {
$('button').click(function() {
var start = Date.now();

fetchAllMessages(0, 100, function (err, messages) {
var end = Date.now();
if (err) console.warn(err);
console.log(messages);
console.log("Time to execute : " + (start - end));
});
});
});

关于javascript - 无法从异步函数中获取 `count`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31631000/

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