增加两个任务之间的延迟并获得意外的执行顺序

时间:2018-08-14 10:31:45

标签: javascript

我有一个循环。我正在循环中执行以下任务。

  1. 读取文件
  2. 将文件内容发送到Web服务并获得响应。

由于Web服务的缓慢性,我需要在这两个任务之间添加延迟。我在这两个任务之间使用了setTimeout。问题是每个任务的执行顺序。当我记录每个任务的输出时,可以看到它首先打印从文件读取的所有文件内容,然后打印“已延迟”消息(n次),然后打印服务调用的响应。根据控制台输出

[File 1 content]
[File 2 content]
[File 3 content]
Delayed
Delayed
Delayed
[Service response for File1]
[Service response for File2]
[Service response for File3]

似乎这三个任务是并行执行的,而不是顺序执行的。我的目标是按顺序执行它们。

我的代码中导致上述行为的问题是什么

以下是我的代码

function myFunction() {
    console.log("Delayed");
}

filenames.forEach(function (filename) {

  fs.readFile(dir + filename, 'utf8', function(err, fileContent) {

     console.log(fileContent);

     setTimeout(myFunction, 3000);


     anotherAsyncServiceCall(fileContent, function (err, response) {
    .....
    )};

}

2 个答案:

答案 0 :(得分:1)

使函数成为async函数,并将await设置为异步任务。

function myFunction() {
  console.log("Delayed");
}

let contents = [];
let responses = [];

const fileReading = async (filename) => {
  const content = await fs.readFileSync(dir + filename, 'utf8');
  contents.push(content);
}

const getResponse = async (content) => {
  const response = await anotherAsyncServiceCall(content);
  responses.push(response);
}

filenames.forEach(async function(filename) {
  await fileReading(filename);
});


contents.forEach(async function(content) {
  await getResponse(content);
});

您可以从responses数组中获得响应。

答案 1 :(得分:1)

您可以通过多种方法来实现自己的目标。

  

使用承诺作为回报

student_id
  

列出所有承诺,然后使用Promise.all()一次全部执行它们

fs.readfile(dir + filename, 'utf8',function(err, fileContent){
 if(err) throw err;
  return anotherAsyncServiceCall(fileContent);
}).then(function(err, response){
 if(err) throw err;
  //return the response or do any thing
}).catch(function(exception){
  console.log('exception occured',exception);
});

,然后使用//creating a global variable to contain our promises var promiseList =[]; filenames.forEach(function (filename) { var fileContent= fs.readFileSync(dir + filename, 'utf8'); promiseList.push(anotherAsyncServiceCall(fileContent)); }); 执行所有承诺:

Promise.all()
  

使用异步-等待

Promise.all(promiseList).then(function(err,response) {
     console.log(response);
});
  

更新 fs.readFile不是promise,而是异步的,因此它支持回调。