Javascript:同步执行

时间:2018-05-07 02:10:34

标签: javascript node.js mocha 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需要时间来执行,因为执行需要几秒钟。请帮助我如何获得所需的输出。

1 个答案:

答案 0 :(得分:4)

request异步运行 ,而不是同步运行,makeARestCall当前没有返回任何内容。您可能应该makeARestCall返回承诺,然后在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将被提升到外部区块并且具有相同的值(5)请求回来了。 (尽量避免隐式创建全局变量)