Javascript嵌套的方法/序列,用于执行它们

时间:2018-01-12 11:36:48

标签: javascript node.js function

我是Javascript的新手,遇到了问题。在我的脚本中,我想获取添加到文件夹的最后一个文件。这工作正常,但是当我想在之后使用该文件名时它不起作用。因为在控制台上我可以看到脚本没有按照我期望的顺序执行。

var fs = require('fs');
var direc = path.join(__dirname, '../', 'uploads');
var url = 'start';

console.log('1');

fs.readdir(direc, function(err, list){
  list.forEach(function(file){
    current = fs.statSync(direc + '/' + file).ctime;
    if (current > temp ){
      url = file;
      console.log('2');
    }
    temp = fs.statSync(direc + '/' + file).ctime;
  })
  console.log('3');
});

console.log(url);   
console.log('4');

控制台中的结果是:

1
start
4
3
2

为什么javascript不会以您预测的方式执行,意思是1 - > 2 - > 3 - > url - > 4?

2 个答案:

答案 0 :(得分:1)

那是因为您正在执行asynchronous操作。而不是等待响应,执行立即继续,并且执行请求调用后的语句。

您可以使用callback功能解决此问题。

function read(callback){
   fs.readdir(direc, function(err, list){ 
      list.forEach(function(file){
         current = fs.statSync(direc + '/' + file).ctime;
         if (current > temp ){
           url = file;
         }
         temp = fs.statSync(direc + '/' + file).ctime;
      })
      callback(url);
    });
}

read(function(url){
     console.log(url); 
});

以下是解决问题的可行方法。

  • 使用async / await承诺ES2017+
  • 回调
  • 承诺与then()ES2015+

答案 1 :(得分:-1)

这是因为JavaScript的car.doors[i]功能异步。这意味着它不能保证它将按照您在代码中的顺序调用它。

您可能需要查看: