为什么即使在等待所有诺言解决之后,最终的console.log也不显示整个数据?

保密

编辑

因此,如果我setTimeout在final上设置a console.log,它将正常运行,但是我想我的新问题是,即使使用then语句,为什么在解决所有问题后仍不触发它?

我有一个奇怪的错误,我无法弄清楚为什么它没有打印我期望的整个结构。我没有遇到任何错误,并且确实尝试输入了一些console.log,但是似乎得到了anyOf要记录属性。它始终显示为空。

我的主要问题是hold未正确记录。它显示anyOf为空。

const $ = require('cheerio');
const Axios = require('axios').default;
let name = 'sqs';
let basePath = '/AWS_SQS.html'


let hold = {
    '$schema': 'http://json-schema.org/draft-07/schema#',
    '$id': `cf${name}`,
    'description': `CF ${name}`,
    'properties': {
        'Type': {
            'type': 'string',
            'enum': [],
        },
    },
    'anyOf': [] // this keeps coming up empty
};

let typeProperties = (t, p) => {
    return {
        'if': { 'properties': { 'Type': { 'const': t } } },
        'then': {
            'properties': {
                'Properties': {
                    'type': 'object',
                    'properties': p,
                },
            },
        },
    }
}

const makeRequest = (bpath) => {
    let url = 'https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/' + bpath
    return Axios.get(url)
        .then((res) => {
            return res.data;
        })
        .catch(console.log);
};

let getData = makeRequest(basePath).then((data) => {
    let match = $('.listitem>p>a', data);
    match.map((i, e) => {
        let t = $(e);
        hold.properties.Type.enum.push(t.text());
        makeRequest(t.attr('href')).then((newdata) => {
            let holdProperties = {}
            let pType = $($('.variablelist', newdata)[0])
            $('.term>.code', pType).map((i, elem) => {
                let propertyName = $(elem).text()
                holdProperties[propertyName] = {}
            })
            hold.anyOf.push(typeProperties(t.text(), holdProperties))
        }).catch(console.log)
    });
}).catch(console.log)

getData.then(() => {
    // Why doesnt this log fully once everything is resolved? If i put a setTimeout here, it will work fine
    console.log(JSON.stringify(hold));
}).catch(console.log)
jfriend00

里面有相关的代码getData(),你正在做makeRequest().then()内部的.map(),但完全无视该承诺makeRequest()正在恢复。您不是在等他们。您需要使用它们Promise.all()来等待所有这些,以便您可以返回与所有其他诺言完成有关的诺言。

您可以这样做:

let getData = makeRequest(basePath).then((data) => {
    let match = $('.listitem>p>a', data).get();
    return Promise.all(match.map(item => {
        let t = $(item);
        hold.properties.Type.enum.push(t.text());
        return makeRequest(t.attr('href')).then((newdata) => {
            let holdProperties = {}
            let pType = $($('.variablelist', newdata)[0])
            $('.term>.code', pType).map((i, elem) => {
                let propertyName = $(elem).text()
                holdProperties[propertyName] = {}
            })
            hold.anyOf.push(typeProperties(t.text(), holdProperties))
        }).catch(err => {
            console.log(err);
            throw err;              // propagate error back to caller
        });
    }));
}).catch(console.log)

getData.then(() => {
    // Why doesnt this log fully once everything is resolved? If i put a setTimeout here, it will work fine
    console.log(JSON.stringify(hold));
}).catch(console.log)

此代码中的更改:

  1. 里面的.map()添加return,所以你必须return makeRequest(...)让你.map()将返回承诺的数组。
  2. 从承诺进行阵列.map()使用return Promise.all(match.map(...)),所以你在等待来自所有承诺.map()等你回来的是总结的承诺。
  3. 使用来从jQuery / cheerio获取真实数组,.get()因此您可以对其使用真实的ES6迭代操作。
  4. 然后切换参数以.map()匹配其array.map()用途。

注意,hold.anyOf由于所有并行makeRequest()调用都可以按任何顺序完成,因此数组的结果将没有保证的顺序。如果要按顺序排列它们,则应从.then()处理程序中返回值,然后Promise.all()按顺序累加所有值,然后可以从数组中使用它们,这些值是Promise.all()按请求顺序排列后的

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

等待所有诺言解决

来自分类Dev

listview什么都不显示并隐藏数据

来自分类Dev

为什么d3更新整个数据

来自分类Dev

为什么在reduceByKey之后所有数据最终都集中在一个分区中?

来自分类Dev

为什么console.log不显示分配的var的IEEE-754浮点值?

来自分类Dev

密谋不显示所有数据

来自分类Dev

当我只传递没有x,y,数据参数的整个数据框时,箱形图显示了什么结果?

来自分类Dev

为什么JSON不显示数据

来自分类Dev

即使console.log输出显示数据,React Axios调用也不显示任何数据

来自分类Dev

即使console.log输出显示数据,React Axios get方法也不显示任何数据

来自分类Dev

console.log()不显示实际值

来自分类Dev

为什么`df -h`不显示整个磁盘空间?

来自分类Dev

为什么不显示所有记录?

来自分类Dev

为什么我的PickerView不显示数据

来自分类Dev

为什么不显示整个地图?

来自分类Dev

为什么在reduceByKey之后所有数据最终都集中在一个分区中?

来自分类Dev

为什么即使我有所有约束,UIImageView也无法填充整个CollectionViewCell

来自分类Dev

QSerialPort-等待发件人的整个数据

来自分类Dev

为什么显示数据时tad不显示?

来自分类Dev

为什么数据不显示?

来自分类Dev

git log 对所有项目不显示任何内容

来自分类Dev

为什么这个数据不显示

来自分类Dev

为什么不显示所有数据?

来自分类Dev

为什么 console.log 显示所有内容,而只打印一个?

来自分类Dev

即使所有数据都显示在 console.log() 中,为什么所有数据都不会显示在浏览器上?

来自分类Dev

即使整个数据都在缓冲池中,为什么 InnoDB 在全表扫描时如此缓慢?

来自分类Dev

在特定列之后加入两个数据框但不显示索引

来自分类Dev

为什么它不显示最终产品?

来自分类Dev

如何对整个数据框/所有列应用条件

Related 相关文章

  1. 1

    等待所有诺言解决

  2. 2

    listview什么都不显示并隐藏数据

  3. 3

    为什么d3更新整个数据

  4. 4

    为什么在reduceByKey之后所有数据最终都集中在一个分区中?

  5. 5

    为什么console.log不显示分配的var的IEEE-754浮点值?

  6. 6

    密谋不显示所有数据

  7. 7

    当我只传递没有x,y,数据参数的整个数据框时,箱形图显示了什么结果?

  8. 8

    为什么JSON不显示数据

  9. 9

    即使console.log输出显示数据,React Axios调用也不显示任何数据

  10. 10

    即使console.log输出显示数据,React Axios get方法也不显示任何数据

  11. 11

    console.log()不显示实际值

  12. 12

    为什么`df -h`不显示整个磁盘空间?

  13. 13

    为什么不显示所有记录?

  14. 14

    为什么我的PickerView不显示数据

  15. 15

    为什么不显示整个地图?

  16. 16

    为什么在reduceByKey之后所有数据最终都集中在一个分区中?

  17. 17

    为什么即使我有所有约束,UIImageView也无法填充整个CollectionViewCell

  18. 18

    QSerialPort-等待发件人的整个数据

  19. 19

    为什么显示数据时tad不显示?

  20. 20

    为什么数据不显示?

  21. 21

    git log 对所有项目不显示任何内容

  22. 22

    为什么这个数据不显示

  23. 23

    为什么不显示所有数据?

  24. 24

    为什么 console.log 显示所有内容,而只打印一个?

  25. 25

    即使所有数据都显示在 console.log() 中,为什么所有数据都不会显示在浏览器上?

  26. 26

    即使整个数据都在缓冲池中,为什么 InnoDB 在全表扫描时如此缓慢?

  27. 27

    在特定列之后加入两个数据框但不显示索引

  28. 28

    为什么它不显示最终产品?

  29. 29

    如何对整个数据框/所有列应用条件

热门标签

归档