【问题标题】:Javascript: Synchronous execution [duplicate]Javascript:同步执行
【发布时间】:2018-05-07 02:10:34
【问题描述】:

** 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需要时间来执行,因为它需要几秒钟的执行时间。请帮助我如何获得所需的输出。

【问题讨论】:

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


    【解决方案1】:

    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 将被提升到外部块,并且一旦所有请求返回,将具有相同的值 (5)。 (尽量避免隐式创建全局变量)

    【讨论】:

    • 非常感谢。承诺对我来说是一个新概念。这很有帮助,我会阅读更多关于承诺的内容..
    最近更新 更多