我正在制作一个经常刷新数据的函数,而我的请求链存在问题。问题是我有一个运行异步请求的for循环,并且for循环将在请求完成之前完成。
setInterval(function(){ // this updates the total hours of all members every 10 seconds
request({ // this gets all of the loyalty program members
url: "",//omitted
method: "GET"
},
function(listError, listResponse, listBody) {
if(listError == null && listResponse.statusCode == 200) {
var varBody = {};
var listObj = JSON.parse(listBody);
for(var i = 0; i < listObj.result.length; i++) { // parses through all of the members to update their hours
console.log(i);//****PRINT STATEMENT
varBody.index = i;
varBody.memberID = listObj.result[i].program_member.id;
request({ //we do this request to get the steam ID of the program member
url: "",//omitted
method: "GET"
},
function(fanError, fanResponse, fanBody) {
var fan = JSON.parse(fanBody);
if(fanError == null && fanResponse.statusCode == 200 && fan.result.profiles.length != 0) { // make sure that the profile isn't empty
request({
url:"",//omitted
method: "GET"
},
function(hourError, hourResponse, hourBody) {
if (hourError == null && hourResponse.statusCode == 200) {
var gameList = JSON.parse(hourBody);
var minutes = 0;
for (var j = 0; j < gameList.response.games.length; j++) { // for loop to calculate the minutes each user has on steam
minutes += gameList.response.games[j].playtime_forever;
}
var deltaHours = 1;
if(deltaHours != 0) {
var transaction = { // updated member object to be inserted
pointsearned: deltaHours,
pointsused: 0,
loyaltyprogram_id: loyaltyID,
programmember_id: memberID
};
request({ // POST request to update the member
url: "",//omitted
method: "POST",
body: JSON.stringify(transaction),
headers: {
"Content-Type": "application/json"
}
},
function(updateError, updateRes, updateBody) {
if(updateError == null && updateRes.statusCode == 200) {
console.log("Success");//****PRINT STATEMENT
}
}
);
}
}
}
);
}
}
);
}
}
console.log("Users Updated"); //****PRINT STATEMENT
}
);
}, 10000);
如果我要运行此代码,它将显示:
0
1
2
3
Success
Success
Success
Success
我知道是什么问题。事实上,for循环不会等待请求完成。我不知道这是一种解决方法。有人有什么想法吗?
您需要异步库。
例如,
for(var i = 0; i < listObj.result.length; i++) {
varBody.index = i;
varBody.memberID = listObj.result[i].program_member.id;
request(
...
, function () {
// Do more Stuff
});
}
可以这样写:
async.forEachOf(listObj.result, function (result, i, callback) {
varBody.index = i;
varBody.memberID = result.program_member.id;
request(
...
, function () {
// Do more Stuff
// The next iteration WON'T START until callback is called
callback();
});
}, function () {
// We're done looping in this function!
});
异步中有很多方便的实用程序函数,这些函数使回调的使用变得更加容易。
我很确定我错过了一些次要的东西。我在对象数组上应用了一个javascript Foreach循环。在循环中,我正在对api进行异步调用以更新数据。我想要的是Foreach循环,在进入下一个迭代之前等待promise实现。 这是代码示例
我正在尝试做一个简单的应用程序,加载数据并对其执行一个操作.所以我的想法是做这个异步。 我有3个数据源,我想异步加载它们。例如data1.xml、data2.xml和data3.xml所有文件加载起来都相当大,所以需要一些时间(这就是为什么我想要异步的原因)。 例如,我创建了一个包含3个文本框的窗口,这些文本框都绑定到一个特定的属性(Text1、Text2、Text3)和一个按钮。当我点击按钮时,
问题内容: 我写了这段代码 然后我尝试在另一个文件中使用它 我有一个错误 “等待仅在异步功能中有效” 有什么问题 问题答案: 错误不是指而是。 我利用这个问题的机会来告诉你一个已知的反模式的使用方法:。 错误 正确 另外,要知道有一个正确且重要的特殊情况:(使用try / catch)
我试图在react/electron项目中使用async/await,但它不起作用。我想要的是获取docker容器状态列表。但是安慰。日志(列表)返回未定义的。 有人能帮我吗?:)
当接收事件时,Akka参与者将一次处理一条消息,直到请求完成后才移动到下一条消息。 例如: 这将调用doThing()并开始处理未来,但不会在处理下一条消息之前等待它完成--它将简单地以尽可能快的速度执行队列中的下一条消息。 实质上,Akka似乎认为“返回未来”是“完成处理”,并进入下一个消息。
问题内容: 我正在尝试使用新的异步功能,希望解决我的问题以后能对其他人有所帮助。这是我的代码正在工作: 问题是,我的while循环运行得太快,脚本每秒向Google API发送太多请求。因此,我想构建一个睡眠函数以延迟请求。因此,我也可以使用此功能来延迟其他请求。如果还有其他方法可以延迟请求,请告诉我。 无论如何,这是我的新代码不起作用。请求的响应在setTimeout中返回给匿名异步函数,但是我