蓝鸟的承诺,promise.each只执行一次 [英] Bluebird promise, promise.each only executes once

查看:325
本文介绍了蓝鸟的承诺,promise.each只执行一次的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有一个名为musicPromise()的函数。这个功能是

There is a function called musicPromise(). What this function does is


  1. 它获取所有mp4文件并循环通过它。

  2. 然后它尝试将每个mp4转换成mp3,使用 fluent-ffmpeg

  1. It gets all mp4 files and loop through it.
  2. then it tries to convert each mp4 to mp3, using fluent-ffmpeg

问题我正在面对的是


  1. 只有转换1个文件,无论我有多少个mp4文件。

  1. It only converts 1 file, no matter how many mp4 files I have.

似乎没有达到 proc.on('end',(x)=> {

这里的完整代码:

// search
const glob = require('glob');
// wait for
const Promise = require('bluebird');
// fs
const fs = require('fs');
// mp3
const ffmpeg = require('fluent-ffmpeg');

// video source file path
const videoPath = '/home/kenpeter/Videos/4K\ Video\ Downloader';

// audio source file path
const audioPath = __dirname + "/audio";

// child process, exec
const exec = require('child_process').exec;

// now rename promise
function renamePromise() { return new Promise((resolve, reject) => {
  glob(videoPath + "/**/*.mp4", (er, files) => {
      Promise.each(files, (singleClipFile) => {
        return new Promise((resolve1, reject1) => {
          let arr = singleClipFile.split("/");
          let lastElement = arr[arr.length - 1];
          let tmpFileName = lastElement.replace(/[&\/\\#,+()$~%'":*?<>{}\ ]/g, "_");
          let tmpFullFile = videoPath + "/"+ tmpFileName;

          // rename it
          fs.rename(singleClipFile, tmpFullFile, function(err) {
            if ( err ) console.log('ERROR: ' + err);

            console.log("-- Rename one file --");
            console.log(tmpFullFile);
            resolve1();
          }); // end rename
        });
      })
      .then(() => {
        console.log('--- rename all files done ---');
        resolve();
      });
    });

  }); // end promise
};


// music promise
function musicPromise() { new Promise((resolve, reject) => {
    glob(videoPath + "/**/*.mp4", (er, files) => {
      Promise.each(files, (singleClipFile) => {
        return new Promise((resolve1, reject1) => {
          // test
          console.log('-- music promise --');
          console.log(singleClipFile);

          // split
          let arr = singleClipFile.split("/");

          // e.g. xxxx.mp4
          let clipFile = arr[arr.length - 1];

          // e.g. xxxx no mp4
          let fileName = clipFile.replace(/\.[^/.]+$/, "");

          // music file name
          let musicFile = fileName + '.mp3';

          // set source
          let proc = new ffmpeg({source: singleClipFile});

          // set ffmpeg path
          proc.setFfmpegPath('/usr/bin/ffmpeg');

          // save mp3
          proc.output("./audio/" + musicFile);

          // proc on error
          proc.on('error', (err) => {
            console.log(err);
          });

          // done mp3 conversion
          proc.on('end', (x) => {
            console.log("single mp3 done!");
            console.log(x);
            // it is resolve1..............
            resolve1();
          });

          // Run !!!!!!!!!!!!!
          proc.run();

        });
      })
      .then(() => {
        console.log('--------- all mp3 conversion done --------');
        resolve();
      });

    }); // end glob
  });
};

// adb kill
function adbKillPromise() { return new Promise((resolve, reject) => {
  exec("adb kill-server", (err, stdout, stderr) => {
      if (err) {
        console.error(err);
        return;
      }

      console.log(stdout);
      console.log('---adb kill---');
      resolve();
    });
  });
};

// adb start
function adbStartPromise() { return new Promise((resolve, reject) => {
    exec("adb start-server", (err, stdout, stderr) => {
      if (err) {
        console.error(err);
        return;
      }

      console.log(stdout);
      console.log('---adb start---');
      resolve();
    });
  });
};

// adb push promise
function adbPushPromise() { return new Promise((resolve, reject) => {
  glob(audioPath + "/**/*.mp3", (er, files) => {
      Promise.each(files, (singleMusicFile) => {
        return new Promise((resolve1, reject1) => {
          let cmd = "adb push" + " " + singleMusicFile + " " + "/sdcard/Music";
          exec(cmd, (err, stdout, stderr) => {
            console.log(cmd);
            resolve1();
          });
        });
      })
      .then(() => {
        console.log('---- done push all music ---');
        resolve();
      });

    });
  });
};

// Run !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
renamePromise()
  .then(musicPromise)
  .then(adbKillPromise)
  .then(adbStartPromise)
  .then(adbPushPromise)
  .then(() => {
    console.log('---- all done----');
    process.exit(0);
  })
  .catch(err => {
    console.log('Error', err);
    process.exit(1);
  });


推荐答案

一个非常愚蠢的错误

function musicPromise() { new Promise((resolve, reject) => {

应该是

function musicPromise() { return new Promise((resolve, reject) => {

这篇关于蓝鸟的承诺,promise.each只执行一次的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆