JS 节点,在执行第二个函数之前等待函数完成
JS node, waiting for function to complete before executing second function
我正在尝试执行 firstFunction()
来解析 csv 文件和 returns 一些数据,然后将其传递给 secondFunction()
以执行一些操作。我已经独立测试了它们并且它们都按预期工作,但是在 firstFunction()
完成后我无法让 secondFunction()
执行。这导致 'data' 在执行时未定义。
function parentFunc(){
firstFunction(function(data){
secondFunction(data);
});
}
function firstFunction(){
var inputFile = 'import.csv';
var dataOutput = [];
var colHead = [];
var parser = parse({delimiter: ','}, function(err, data){
colHead.push(data[0][0],data[0][1],data[0][2],data[0][3],data[0][4]);
for( i = 1; i<data.length; i ++ ){
var line = {[colHead[0]]:data[i][0],
[colHead[1]]:data[i][1],
[colHead[2]]:data[i][2],
[colHead[3]]:data[i][3],
[colHead[4]]:data[i][4]};
dataOutput.push(line);
}
});
var readStream = fs.createReadStream(inputFile).pipe(parser);
readStream.on('end', function(){
return dataOutput;
})
}
async function secondFunction(data){
for(i=0; i<data.length;i++){
//some operations with data, using await keyword.
}
}
parentFunc();
我觉得解决方案应该不会那么难,可能是因为我的根本误解。
如果需要更多信息,请告诉我。
您可以从第一个函数 return promise
function sometestFunction() {
return Math.random();
}
function secondFunction(data) {
console.log('data received from first function ' + data)
}
function firstFunction() {
return Promise.resolve(sometestFunction())
}
firstFunction().then(function(data) {
secondFunction(data);
})
在您的情况下,async
await
的用法似乎是错误的。 await
总是在 async
中。所以使用 async
和父函数 await
直到 firstFucntion 被解析
async function parentFunc() {
let x = await firstFunction();
secondFunction(x);
}
function firstFunction() {
return new Promise(function(resolve) {
setTimeout(() => {
resolve([1, 2, 3, 4, 5, 6]);
}, 3000)
})
}
function secondFunction(data) {
for (var i = 0; i < data.length; i++) {
console.log(data[i])
}
}
parentFunc();
发生这种情况的原因是因为解析您的 csv
文件是一个 异步 操作。
要确保您的 secondFunction
将在您的 firstFunction
之后执行,您需要使用 promises 或 async/await.
基本上是这样的:
使用承诺
function parentFunc() {
firstFunction().then(secondFunction)
}
使用async/await
async function parentFunc() {
let data = await firstFunction()
secondFunction(data)
}
这里有一些关于 promises 和 async/await 的额外资源:
希望对您有所帮助!
我正在尝试执行 firstFunction()
来解析 csv 文件和 returns 一些数据,然后将其传递给 secondFunction()
以执行一些操作。我已经独立测试了它们并且它们都按预期工作,但是在 firstFunction()
完成后我无法让 secondFunction()
执行。这导致 'data' 在执行时未定义。
function parentFunc(){
firstFunction(function(data){
secondFunction(data);
});
}
function firstFunction(){
var inputFile = 'import.csv';
var dataOutput = [];
var colHead = [];
var parser = parse({delimiter: ','}, function(err, data){
colHead.push(data[0][0],data[0][1],data[0][2],data[0][3],data[0][4]);
for( i = 1; i<data.length; i ++ ){
var line = {[colHead[0]]:data[i][0],
[colHead[1]]:data[i][1],
[colHead[2]]:data[i][2],
[colHead[3]]:data[i][3],
[colHead[4]]:data[i][4]};
dataOutput.push(line);
}
});
var readStream = fs.createReadStream(inputFile).pipe(parser);
readStream.on('end', function(){
return dataOutput;
})
}
async function secondFunction(data){
for(i=0; i<data.length;i++){
//some operations with data, using await keyword.
}
}
parentFunc();
我觉得解决方案应该不会那么难,可能是因为我的根本误解。
如果需要更多信息,请告诉我。
您可以从第一个函数 return promise
function sometestFunction() {
return Math.random();
}
function secondFunction(data) {
console.log('data received from first function ' + data)
}
function firstFunction() {
return Promise.resolve(sometestFunction())
}
firstFunction().then(function(data) {
secondFunction(data);
})
在您的情况下,async
await
的用法似乎是错误的。 await
总是在 async
中。所以使用 async
和父函数 await
直到 firstFucntion 被解析
async function parentFunc() {
let x = await firstFunction();
secondFunction(x);
}
function firstFunction() {
return new Promise(function(resolve) {
setTimeout(() => {
resolve([1, 2, 3, 4, 5, 6]);
}, 3000)
})
}
function secondFunction(data) {
for (var i = 0; i < data.length; i++) {
console.log(data[i])
}
}
parentFunc();
发生这种情况的原因是因为解析您的 csv
文件是一个 异步 操作。
要确保您的 secondFunction
将在您的 firstFunction
之后执行,您需要使用 promises 或 async/await.
基本上是这样的:
使用承诺
function parentFunc() {
firstFunction().then(secondFunction)
}
使用async/await
async function parentFunc() {
let data = await firstFunction()
secondFunction(data)
}
这里有一些关于 promises 和 async/await 的额外资源:
希望对您有所帮助!