节点承诺不值得等待

时间:2020-08-18 16:25:31

标签: node.js typescript es6-promise

因此,我将竭尽全力使节点中的流,promise和async功能得到解决。我似乎从来没有做对。我有两个非常相似的用例(看起来很标准)。像这样:

  1. 我有一个流可以获取一些数据
  2. 我需要将其通过管道传递给进程(在这种情况下为fast-csv)
  3. 完成后,我需要将其发送到下一步(实际上是发送到数据库)
  4. 在现实世界中,我需要等待数据库更新完成
  5. 下一步打开下一个文件流
  6. 过程
  7. 添加
  8. 重复...

因此,下面的代码“ SHOULD”就是这样做的,但是诺言不会等待被解决。等待仅在异步函数中起作用(并且流似乎主动忽略使用等待的任何尝试)

import { parseString } from '@fast-csv/parse';
import * as fs from "fs";

async function IHateStreams (){
    /** Lets read profiles */
    console.log("1: Reading Program " + profileFS);
    let fileContent = fs.readFileSync(profileFS, 'utf8');
    let dataset : Array<any> = []
    return new Promise((resolve, reject) => {
        parseString(fileContent, {headers: true})
            .on('error', error => console.error(error))
            .on('data', row => dataset.push(row))
            .on('end',  () {
                console.log("2: Inside Done")
                resolve
            });
    })

}

IHateStreams().then(console.log("3: stream done!"));
console.log("4: code done, so running next command with the data")

代替好的输出:

1: Reading Program ./dbinitdata/ProfileIdName.csv
2: Inside Done
3: stream done!
4: code done

我得到:

1: Reading Program ./dbinitdata/ProfileIdName.csv 
3: stream done! 
4: code done 
2: Inside Done

1 个答案:

答案 0 :(得分:-1)

经过所有的忙碌之后,我是如此亲密。上面的代码由于3个原因而失败。 (如果有人在我的旅途中)

兑现承诺似乎可行,上述问题是:

  1. 忘记.then()特定于流的内容
  2. 错别字不会带你去任何地方,resolve()
  3. 出于我所需要的目的(而不是架构师),创建一个async控制函数,并通过将流包裹在一个Promise中后逐流踢来假装一切都是顺序的。

也许有更轻松的方法可以做到这一点,但希望这会有所启发。

import { parseString } from '@fast-csv/parse';
import * as fs from "fs";

 const profileFS: string = "tsconfig.json"

async function IHateStreams (){
    /** Lets read profiles */
    console.log("1: Reading Program " + profileFS);
    let fileContent = fs.readFileSync(profileFS, 'utf8');
    let dataset : Array<any> = []
    return new Promise((resolve, reject) => {
        parseString(fileContent, {headers: true})
            .on('error', error => console.error(error))
            .on('data', row => dataset.push(row))
            .on('end',  data => {
                console.log("2: Reading Program " + data);
                resolve();
            }
            });
    })

}
async function iWait (){
    const isThisAPromise = await IHateStreams()
    console.log("3: code done, so running next command with the data")
}

iWait();
console.log("1.99: code done, not in chain")