从Web抓取数据后,编写Blocking Js代码以写入= csv文件(使用csv-parser)

时间:2020-06-24 21:30:46

标签: javascript csv events async-await es6-promise

在writeFile fn中,makeCsv函数返回的记录为空(仍在使用:/空)如何使makeCsv内部的所有代码受阻,以便在我调用fn(makeCsv)时获得记录数组中的所有条目
预期的代码流

  1. makeCsv->从本地存储读取csv并调用函数getPubKey
  2. getPubKey->通过请求url并针对makeCsv传递的每次帐户名调用获取密钥,并返回该密钥
  3. makeCsv->将key属性附加到对象,将其推送到结果数组并返回
  4. writeFile->调用makeCsv并接受数组以使用包含的键编写新的Csv

    问题::一旦完成对getPubkey函数的调用,便触发了触发事件,以空数组解决了promise问题,因此writeFile接收到空数组,因为它在makeCsv结束创建所有请求然后将键添加到数据对象之前运行

代码

const csv = require('csv-parser')
const createCsvWriter = require('csv-writer').createObjectCsvWriter;
const fetch = require('node-fetch');
const fs = require('fs');
let nkas = []

async function makeCsv(results) {
    const readable = fs.createReadStream('/home/vector/Desktop/test.csv')
    return new Promise((resolve, reject) => {
        readable.pipe(csv(['acc', 'balance']))
            .on('data', async (data) => {
                data.key = await getPubkey(data.acc)
                results.push(data)
            })
            .on('end', () => {
               return resolve(results);
            });
    })
}

async function getPubkey(account) {
    const body = { account_name: account }
    let key;
    await fetch('https://eos.greymass.com/v1/chain/get_account', {
        method: 'post',
        body: JSON.stringify(body),
        headers: { 'Content-Type': 'application/json' },
    })
        .then(res => res.json())
        .then(json => key = json.permissions[1].required_auth.keys[0].key)
        .catch(err => console.log(err))
    if (key && key.length > 0)
        return key
    else
        nkas.push(account);
    console.log(nkas);

}

async function writeFile() {
    const csvWriter = createCsvWriter({
        path: 'out.csv',
        header: [
            { id: 'acc', title: 'Account' },
            { id: 'balance', title: 'Balance' },
            { id: 'key', title: 'PubKey' }
        ]
    });
    let records = []
    records = await makeCsv(records)
    console.log(records)
    csvWriter.writeRecords(records)       // returns a promise
        .then(() => {
            console.log('...Done');
        });
}
writeFile();

1 个答案:

答案 0 :(得分:1)

在解决makeCsv()承诺之前,您需要等待getPubKey()承诺解析:

phrase_list = []
for phrase in phrases:
    for tweet in tweets:
        if tweet in phrase:
            phrase_list.append(tweet)