javascript - 在嵌套 for 循环内的 super 测试响应后修改对象的问题

标签 javascript node.js for-loop supertest

我的代码是这样的:

let fs = require('fs');
let path = require('path');
let supertest = require('supertest');
let json = require('../../Util/json');
let chai = require('chai');
let assert = chai.assert;

let client = supertest("some_base_url");

describe('My test suite', function () {

    it('My sample test', () => {
        let results = {};
        fs.readdirSync("some_dir").forEach(dir => {
            fs.readdirSync("some_dir" + dir).forEach(file => {
                console.log(`Found file ${file} in directory ${dir}`);
                let json_file = "some_dir" + dir + path.sep + file;
                let data = fs.readFileSync(json_file, 'utf8');
                if (dir !== undefined) {
                    let url = dir + file.split('.')[0];
                    console.log("Request endpoint:", url);
                    client.get(url)
                        .set('Content-Type', 'application/json')
                        .expect(200)
                        .end(function (error, response) {
                            if (error) {
                                console.log("Error:", error);
                            } else {
                                data_obj = JSON.parse(data);
                                result_obj = JSON.parse(response.text);
                                results[dir + '-' + file] = json.assertJson(data_obj, result_obj); // assertJson results boolean value
                            }
                        });
                } else {
                    console.log(`Could not find any endpoint defined for ${dir}, skipping tests for the same.`);
                }
            });
        });
        console.log("Results:",JSON.stringify(results, null, 2));
        assert(!Object.values(results).includes(false));
    });
});

问题是 results 对象在外部 for 循环外打印时为空,但在 for 循环内打印时提供正确填充的输出。尽管我的代码是同步的并且没有使用 promise ,但我想知道为什么会这样。

编辑:在做了一些实验之后(比如在我的代码中注释掉 supertest 代码并简单地修改 for 循环内的 results 对象),我在 for 循环之外得到了 results 的预期输出。所以我相信我使用 supertest 的方式有问题。我打算以同步方式使用它。

最佳答案

由于 Node.js 支持异步,如果您将日志放在 for 循环之外,那么将首先打印日志,因为与 for 循环的执行时间相比,它的执行时间会更少。

您可以在这里尝试这样的组合:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

例如:

var array1 = ['a'];
var array2 = ['d', 'e', 'f'];

array1.forEach(function(element1) {
  array2.forEach(function(element2) {
        setTimeout(function(){
            console.log(element2);
        }, 1000)
  });
});
console.log("Hello");

输出:

"Hello"

"d"

"e"

"f"

关于javascript - 在嵌套 for 循环内的 super 测试响应后修改对象的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53985906/

相关文章:

javascript - ng-repeat 共享相同 ng-model 的 ng-options

node.js - 无法运行全局安装的 Node 模块

javascript - 处理大型 JSON 文件的最佳实践

for-loop - 避免 F# 中的 for 循环

python循环遍历输入文件

javascript - 如何为对象数组运行 ajax?

javascript - Coffee Script 不会在页面更改时触发,但会在页面加载时起作用。 [ rails 5]

javascript - Bootstrap 3.0 与 Jquery 2.0.3 工具提示无法正常工作,知道为什么吗?

javascript - 如何在 javascript 中运行对象的 onEvent 方法?

node.js - 如何枚举nodejs+express中的所有 session ?