Javascript:同步执行

标签 javascript node.js mocha.js webdriver-io

<分区>

** Javascript 新手。请帮忙**

我正在用 Javascript 编写一个简单的“for”循环,但没有得到预期的输出。请求帮助。

for (i = 1; i < 5; i++) {
  console.log(i + ": " + makeARestCall(options));
}

function makeARestCall(options) {
  request(options, function(error, response, body) {
    if (error) throw new Error(error);
    let test = getCount(body);
    console.log("Hello: " + test);
  });
}

function getCount(body) {
  const data = JSON.parse(body.toString()).test.all;
  return data;
}

makeARestCall(options) - 函数对服务进行 Rest 调用并获取一些数据。 getCount(body) - 从从 makeARestCall 函数接收到的 JSON 中返回一个值。

我如何执行:使用 Javascript 编写 Mocha 测试。

当前输出是什么:

1: undefined
2: undefined
3: undefined
4: undefined
Hello: 35
Hello: 35
Hello: 35
Hello: 35

我在期待什么?

1: Hello: 35
2: Hello: 35
3: Hello: 35
4: Hello: 35

“for”循环似乎运行得如此之快,而 makeARestcall 需要时间来执行,因为它需要几秒钟才能执行。请帮助我如何获得所需的输出。

最佳答案

request 运行异步,而不是同步运行,makeARestCall 当前不返回任何内容。您可能应该让 makeARestCall 返回一个 promise,然后在 for 循环中使用它:

for (let i = 1; i < 5; i++) {
  makeARestCall(options)
    .then(responseStr => console.log(i + ': ' + responseStr));
}

function makeARestCall(options) {
  return new Promise((resolve, reject) => {
    request(options, function(error, response, body) {
      if (error) reject(error);
      let test = getCount(body);
      resolve("Hello: " + test);
    });
  });
}

确保使用 let i 而不是 var 或根本不声明,否则 i 将被提升到外部 block 并将一旦所有请求都返回,具有相同的值 (5)。 (尽量避免隐式创建全局变量)

关于Javascript:同步执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50206244/

相关文章:

javascript - Nock 拦截器链接,第二个模拟被忽略

javascript - 为这些 WHILE 编写更好、更紧凑的代码? :) (vanilla JavaScript)

javascript - 使用office js使用密码加密Microsoft Excel

node.js - 按每个用户的总请求数限制 API 端点

linux - 在linux上启动了两个 Node 实例

javascript - 可以通过浏览器和 websockets 连接到 azure 事件中心吗?

javascript - 使用 webdriverio 从 React 包裹的 span 获取文本

unit-testing - 无法找到按钮来模拟点击 - 使用 Mocha、Chai、Enzyme 进行 React 单元测试

javascript - 创建根(...): Target container is not a DOM element in React Test file

javascript - 时间戳中的错误日期