- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在编写一个脚本来在站点上自动为我执行一些操作。到目前为止,我已经解决了所有问题,但我做错了一些事情,只是想找出更好的方法。
我有一个 for 循环,它将通过提取将请求发送到 API。循环次数将基于一个变量。我希望能够在每次提取时处理它们的响应,如果它们中的任何一个以 true 的结果出现,我希望它停止我的 for 循环继续。目前我的工作方式是刷新页面(这将停止我的循环)但这是非常低效的。我只需要以某种方式完成它。
至于同步/异步,我希望它发送请求而不考虑响应,直到响应为真,然后我希望它停止发送请求。如果我有一些请求是可以的,这就是我的页面刷新方法现在发生的情况。
我乐于接受建议并改进整个事情(我只是边走边学,甚至不知道 2 个月前的 js 是什么。但是对于我已经想出如何做的所有事情,我似乎无法掌握这个概念。)
我已经尝试命名循环并中断@name,尝试返回中断,但我尝试过的任何事情都没有成功。唯一有的是页面刷新,我猜这是停止循环的一种方法。
var reqs = 5000;
xId = 970;
xSym = mySymbol;
var looper = async function () {
for (var start = 1; start < reqs; start++) {
await new Promise(resolve => {
setTimeout(function () {
//This is essentially what I need to loop over and over.
//but not any faster then 200 ms per request.
fetch("https://example.com/api/send", {"credentials":"include","body":`{\"xactionId\":\"${xId}\",\"symbol\":\"${xSym}\"}`,"method":"POST","mode":"cors"})
.then(resp => resp.json())
.then(json => {
if(json.test.result === true) {
console.log(json.test.hash, json.test.number);
//
//This is where I want to be able to stop the loop
//If any of the completed results
//come back true to have it discontinue the Looper
//
//currently I do a window.location.reload();
//
}})
.catch(err => console.log(err));
resolve(true);
}, 200);
});
}
return true;
}
looper().then(function(){
console.log("Got a match!");
});
以防万一有人需要我从服务器返回的响应。
{
"result": {
"hash": "dbbb42b293",
"result": false,
"isHigh": false,
"number": 4993,
"threshold": 3,
"chance": 0.03,
"nonce": 2194375,
"created": 1554150935
},
"dailyFree": false,
"status": null,
"user": {
"hash": "aabbccdd8f",
"level": 300,
"username": "user",
"requests": 4440936,
"nonce": 2194376,
"volume": "11.10794076",
"lockedBalance": null,
"session": {
"requests": 5,
"volume": "0.000004"
}
}
}
我希望能够在基于第二个 .then 获取 POST 请求后的结果的循环异步函数中停止 for 循环。
此外,我想知道上述是否可行,同时在其自己的外部函数中也有获取请求,以便我也可以从代码中的其他地方调用它。
解决方案:我使用了@Bergi 建议的最后一个选项。感谢您的帮助!
我的最终代码如下所示:
var reqs = 5000;
xId = 970;
xSym = mySymbol;
function delay(t) {
return new Promise(resolve => setTimeout(resolve, t));
}
async function looper() {
var run = true;
for (var start = 1; run && start < reqs; start++) {
await delay(200);
fetch("https://example.com/api/send", {"credentials":"include","body":`{\"xactionId\":\"${xId}\",\"symbol\":\"${xSym}\"}`,"method":"POST","mode":"cors"})
.then(resp => resp.json())
.then(json => {
if (json.test.result === true) {
console.log(json.test.hash, json.test.number);
run = false;
}
});
}
return true;
}
looper().then(function(){
console.log("DONE!")
});
最佳答案
避免 Promise
constructor antipattern !你应该使用
function delay(t) {
return new Promise(resolve => setTimeout(resolve, t));
}
并且不要在其他地方使用 Promise
构造函数,尤其是环绕其他 promise 调用。我猜你在找
async function looper() {
for (var start = 1; start < reqs; start++) {
await delay(200);
const resp = await fetch("https://example.com/api/send", {"credentials":"include","body":`{\"xactionId\":\"${xId}\",\"symbol\":\"${xSym}\"}`,"method":"POST","mode":"cors"});
const json = await resp.json();
if (json.test.result === true) {
console.log(json.test.hash, json.test.number);
break;
// ^^^^^
}
}
return true;
}
或者让 delay(200)
和 fetch
并行运行,这样您至少要等待 200 毫秒,而不是在 fetch 花费的时间之外:
async function looper() {
for (var start = 1; start < reqs; start++) {
const [, json] = await Promise.all([
await delay(200),
fetch("https://example.com/api/send", {"credentials":"include","body":`{\"xactionId\":\"${xId}\",\"symbol\":\"${xSym}\"}`,"method":"POST","mode":"cors"}).then(resp => resp.json()),
]);
if (json.test.result === true) {
console.log(json.test.hash, json.test.number);
break;
// ^^^^^
}
}
return true;
}
如果你真的wanted to fire off每 200 毫秒获取一个请求,您不能在此处使用 await
。您必须在循环条件中使用 bool 变量来检查是否有任何已收到的响应希望循环停止:
async function looper() {
var run = true;
for (var start = 1; run && start < reqs; start++) {
// ^^^^^^
await delay(200);
fetch("https://example.com/api/send", {"credentials":"include","body":`{\"xactionId\":\"${xId}\",\"symbol\":\"${xSym}\"}`,"method":"POST","mode":"cors"})
.then(resp => resp.json())
.then(json => {
if (json.test.result === true) {
console.log(json.test.hash, json.test.number);
run = false;
// ^^^^^^^^^^^^
}
})
.catch(err => console.log(err));
}
return true;
}
关于javascript - 已解决 : how can i break a for loop based on a response from promise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55463184/
@Cacheable在同一类中方法调用无效 上述图片中,同一个类中genLiveBullets()方法调用同类中的queryLiveByRoom()方法,这样即便标识了Cacheable标签,
目录 @Transaction注解导致动态切换更改数据库失效 使用场景 遇到问题 解决 @Transaction
@RequestBody不能class类型匹配 在首次第一次尝试使用@RequestBody注解 开始加载字符串使用post提交(貌似只能post),加Json数据格式传输的时候,
目录 @Autowired注入static接口问题 @Autowired自动注入普通service很方便 但是如果注入static修饰的serv
目录 @RequestBody部分属性丢失 问题描述 JavaBean实现 Controller实现
目录 解决@PathVariable参数接收不完整的问题 今天遇到的问题是: 解决办法: @PathVariable接受的参
这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚。后来终于找到了原因。 如果你也出现了这种情况,可以从下面开始排查。 1、特性 先来了解一下@Trans
概述: ? 1
场景: 在处理定时任务时,由于这几个方法都是静态方法,在aop的切面中使用@Around注解,进行监控方法调用是否有异常。 发现aop没有生效。 代码如下:
最近做项目的时候 用户提出要上传大图片 一张图片有可能十几兆 本来用的第三方的上传控件 有限制图片上传大小的设置 以前设置的是2M&nb
我已经实现了这个SCIM reference code在我们的应用程序中。 我实现的代码确实通过了此postman link中存在的所有用户测试集合。 。我的 SCIM Api 也被 Azure 接受
我一直对“然后”不被等待的行为感到困扰,我明白其原因。然而,我仍然需要绕过它。这是我的用例。 doWork(family) { return doWork1(family)
我正在尝试查找 channel 中的消息是否仍然存在,但是,我不确定如何解决 promise ,查看其他答案和文档,我可以看到它可能是通过函数实现的,但我是不完全确定如何去做。我希望能在这方面获得一些
我有以下情况: 同一工作区中的 2 个 Eclipse 项目:Apa 和 Bepa(为简洁起见,使用化名)。 Apa 项目引用(包括)Bepa 项目。 我在 Bepa 有一个类 X,具有公共(publ
这个问题已经有答案了: Why am I getting a NoClassDefFoundError in Java? (31 个回答) 已关闭 6 年前。 我正在努力学习 spring。所以我输入
我正在写一个小游戏,屏幕上有许多圆圈在移动。 我在两个线程中管理圈子,如下所示: public void run() { int stepCount = 0; int dx;
我在使用 Sympy 求解方程时遇到问题。当我运行代码时,例如: 打印(校正(10)) 我希望它打印一个数字 f。相反,它给我错误:执行中止。 def correction(r): from
好吧,我制作的每个页面都有这个问题。我不确定我做错了什么,但我所有的页面都不适用于所有分辨率。可能是因为我使用的是宽屏?大声笑我不确定,但在小于宽屏分辨率的情况下,它永远不会看起来正确。它的某些部分你
我正在尝试像这样进行一个非常简单的文化 srting 检查 if(culture.ToUpper() == "ES-ES" || "IT-IT") { //do something } else
Closed. This question is off-topic. It is not currently accepting answers. Learn more。 想改进这个问题吗?Upda
我是一名优秀的程序员,十分优秀!