Node Promise 不值得等待
Node Promise not worth waiting for
所以尽我最大的努力了解 node.js 中的流、promise 和异步函数。我似乎从来没有做对。我有几个非常相似的用例(看起来非常标准)。像这样:
- 我有一个获取一些数据的流
- 我需要将其通过管道传输到进程(在本例中为 fast-csv)
- 完成后,我需要将其发送到下一步(在实际情况下,发送到数据库)
- 在真实场景中,我需要等待数据库更新完成
- 下一步打开下一个文件流
- 进程
- 添加
- 重复...
所以下面的代码“应该”这样做,但承诺不会等待解决。 Await 仅适用于异步函数(并且流似乎主动忽略任何使用 await 的尝试)
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
经过所有的胡说八道,我是如此接近。上面的代码由于 3 个原因而失败。 (如果有人在我的旅程中)
wrap in promise 似乎可行,上面的问题是:
- 忘记
.then()
特定于流的东西
- 错别字不会让你到任何地方,
resolve()
- 为了我需要它的目的,(不是架构师),创建一个
async
控制函数,并让它假装所有的东西都是顺序的,通过一个接一个的流在承诺中包装。
可能有更简单的窒息方法,但希望这会有所启发。
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")
所以尽我最大的努力了解 node.js 中的流、promise 和异步函数。我似乎从来没有做对。我有几个非常相似的用例(看起来非常标准)。像这样:
- 我有一个获取一些数据的流
- 我需要将其通过管道传输到进程(在本例中为 fast-csv)
- 完成后,我需要将其发送到下一步(在实际情况下,发送到数据库)
- 在真实场景中,我需要等待数据库更新完成
- 下一步打开下一个文件流
- 进程
- 添加
- 重复...
所以下面的代码“应该”这样做,但承诺不会等待解决。 Await 仅适用于异步函数(并且流似乎主动忽略任何使用 await 的尝试)
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
经过所有的胡说八道,我是如此接近。上面的代码由于 3 个原因而失败。 (如果有人在我的旅程中)
wrap in promise 似乎可行,上面的问题是:
- 忘记
.then()
特定于流的东西 - 错别字不会让你到任何地方,
resolve()
- 为了我需要它的目的,(不是架构师),创建一个
async
控制函数,并让它假装所有的东西都是顺序的,通过一个接一个的流在承诺中包装。
可能有更简单的窒息方法,但希望这会有所启发。
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")