等待地图功能中的所有承诺

时间:2019-04-01 09:26:47

标签: javascript node.js

我想等待通过地图功能读取所有图片

我尝试过

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-navbar',
  templateUrl: './navbar.component.html',
  styleUrls: ['./navbar.component.scss']
})
export class NavbarComponent implements OnInit {
  optionEng = 'English';
}

但是我的缓冲区仍然是空的...

我知道承诺存在,但我不知道如何将它们包括在map(map())

谢谢:)

3 个答案:

答案 0 :(得分:0)

我将上面的代码重构为:

let files = [];
// loop each dir.
fs.readdirSync(rootFolder).forEach(dirName => {
    // if it's a directory, procede.
  if(fs.lstatSync(path.join(rootFolder, dirName)).isDirectory()){
    console.log(`Entering in folder ${path.join(rootFolder, dirName)}`);
    fs.readdirSync(path.join(rootFolder, dirName)).forEach(picture => {
      if(fs.lstatSync(path.join(rootFolder, dirName, picture)).isFile()){
        // If lstatsync says it's a file and if it starts with "norm"
        if(picture.startsWith("norm")){
            // push a new promise to the array.
          files.push(new Promise((resolve, reject) => {
            fileToTensor(path.join(rootFolder, dirName, picture)).then((img) => {
              buffer.push(img);
              resolve();
            }).catch((error) => {console.log(error); reject(error);});
          }));
        }
      }
    });
  }
});

// Resolve all promises.
Promise.all(files).then(() => {
    // Then do whatever you need to do.
    console.log(buffer);
}).catch((errors) => {
    console.log('one ore more errors occurred', errors);
});

基本上,这就是我所做的:

  1. 已删除.map,因为在这种情况下没有必要。另外,在您的情况下,并非所有代码路径都返回结果,因此并非每个回调都返回结果。
  2. 将每个需要的项目推入文件数组Promise[]
  3. 在文件数组上称为Promise.all。每个已解决的承诺都会将结果推送到buffer数组中。我会以不同的方式来处理它,但是,这是我能想到的最快的方法。
  4. Promise.all上注册了一个回调,以便定义buffer

请注意,有很多第三方库可以帮助您避免嵌套循环并保证循环文件系统。我刚刚发布了这篇文章,试图给出一些可以使用现有代码实际工作的东西,尽管在这里整个重构很聪明,而且对可用节点库的初步分析也将有助于使代码更易于阅读和维护。

答案 1 :(得分:0)

首先提供一些建议:

  1. 请勿将箭头功能用于您无法将其放在一行中的任何内容(它们并非用于此目的,这会破坏可读性)

  2. 检查传递给.map()的每个回调实际上返回的内容(第一个没有返回。似乎您在内部return之前错过了fs.readdir(..)...

    < / li>
  3. 最好尝试命名所有功能(在某些情况下最好选择箭头功能)。这样,我不仅可以命名它以更好地识别它们,而且堆栈跟踪将更易读和有用(可跟踪)。

也就是说,您正在同步读取目录(和子目录)以最终返回承诺(我知道fileToTensor()应该会返回承诺)。它可能不会对整体执行时间产生重大影响,因为我想实际的文件处理会贵得多,但是这是一个不好的模式,因为您在树扫描期间阻止了事件循环(因此,如果您的代码用于服务器)需要参加其他请愿的活动,您的表现就会降低...)。

最后,正如其他人已经说过的那样,还有诸如glob之类的库可以简化该任务。

另一方面,如果您想自己做(作为一项理解练习),我自己在了解 glob 之前可以为同一任务实施my own library一个简单的例子。

答案 2 :(得分:0)

对,我已经更新了您的代码,请检查一次。可能会有所帮助:)

startActivity(new Intent(SplashScreen.class, StartingPoint.class);