【问题标题】:How to execute code in order in a while loop in Javascript?如何在Javascript中的while循环中按顺序执行代码?
【发布时间】:2020-09-05 16:24:28
【问题描述】:

我正在尝试在 Postman 上运行一些 JavaScript 代码,但我找不到让它按照我需要的顺序运行的方法。这就是我想要做的:

  • 检索 API 响应并验证“待处理”数组是否包含任何项目
  • 如果 id 存在,我会将记录的 id (orderId) 保存在环境变量中以在我的实际请求中使用
  • 此时我将设置 found = true 并在它离开 setTimout 函数时中断循环

注意:我创建了一个函数来在尝试之间引入 400 毫秒的延迟,因为它将允许填充待处理的数组

    var found = false;
    var counter = 0;

    while (counter < 10) {

        setTimeout(async () => {
            var size = await response.json().pending.length;

            if (size > 0) {
                var orderId = response.json().pending[0].orderId;
                pm.environment.set("current_order", orderId);
                found = true;
            }
        }, [400]);

        console.log(found);
        if (found) { break; }

        counter++;
    }

我的问题是 setTimeout 函数之外的部分首先执行,所以它永远不会满足条件“如果(找到)”。它总是执行代码 10 次,即使在第一次尝试中找到了记录。

我的问题是:如何编写它以检查是否在每次尝试后都找到了记录,如果是肯定的则退出循环?

谢谢!

【问题讨论】:

  • 代替“whiling”,您可以只使用递归函数。如果函数失败,则再次执行(如果需要,可以使用计数器),如果成功,则离开函数。

标签: javascript loops asynchronous async-await postman


【解决方案1】:

如上所述,您也许可以使用更简单的递归函数来解决此问题。外观示例:

var found = false;
var size = 0;

async function checkResponse() {
  var size = await response.json().pending.length;

  if (size > 0) {
    var orderId = await response.json().pending[0].orderId;
    pm.environment.set('current_order', orderId);
    found = true;
  }
  if (!found) {
    await checkResponse();
  }
}

await checkResponse();

下面是对上述逻辑的同步测试:
var found = false;
// var size = 0;
var size = -5;

function checkResponse() {
  // var size = await response.json().pending.length;
  size += 1;
  console.log(size);

  if (size > 0) {
    // var orderId = response.json().pending[0].orderId;
    // pm.environment.set('current_order', orderId);
    console.log("pm.environment.set('current_order', orderId);");
    found = true;
  }
  console.log('END?');
  console.log(found);
  if (!found) {
    checkResponse();
    console.log('checkResponse();');
  }
}

checkResponse();

输出:

-4
END?
false
-3
END?
false
-2
END?
false
-1
END?
false
0
END?
false
1
pm.environment.set('current_order', orderId);
END?
true
checkResponse();
checkResponse();
checkResponse();
checkResponse();
checkResponse();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-16
    • 2023-03-29
    • 2017-02-22
    • 2011-02-07
    • 2022-06-10
    • 2019-06-20
    • 1970-01-01
    • 2021-08-09
    相关资源
    最近更新 更多