Bluebird Promisify execFile 无法得到解决的承诺

Bluebird Promisify execFile can't get promise to resolve

请原谅我的笨拙,但为什么这不起作用? then() 永远不会被解雇,error() 也不会。承诺似乎永远无法解决。

感谢任何指点。谢谢

var Promise = require('bluebird');
var execFile = require('child_process').execFile;
execFile = Promise.promisify(execFile);
var IMAGE_DIR = "resources/assets/images";
var validImages = ['.jpg', '.png'];

 ... // setup omitted ... 

execFile('find', [IMAGE_DIR], function (err, stdout, stderr) {
  var images = [];
  return new Promise(function(resolve) {
    var fileList = stdout.split('\n');
    images = fileList.filter(function (image) {
      var ext = path.extname(image);
      if (validImages.indexOf(ext) > -1) {
        return image;
      }
    })
    return resolve(images);
  })
}).then(function () {
  console.log(arguments);
}).catch(console.log.bind(console));

您只是没有正确使用 execFile() 的承诺版本。

你应该做的:

const Promise = require('bluebird');
const execFile = Promise.promisify(require('child_process').execFile);

execFile('find', [IMAGE_DIR]).then(function(stdout) {
    // process result here
}).catch(function(err) {
    // handle error here
}); 

如果您需要同时访问 stdoutstderr,则必须将 multiArgs 选项传递给 .promisify()

const Promise = require('bluebird');
const execFile = Promise.promisify(require('child_process').execFile, {multiArgs: true});

execFile('find', [IMAGE_DIR]).then(function(args) {
    let stdout = args[0];
    let stderr = args[1];
    // process result here
}).catch(function(err) {
    // handle error here
}); 

非常感谢jfriend000的回答。无论如何,如果你想要一个带有异步等待的 ES7 解决方案:

const Promise = require('bluebird');
const execFile = Promise.promisify(require('child_process').execFile

const find = async () => {
  try{
      let output = await execFile('find', [IMAGE_DIR]);
      // handle your output with the variable
  } catch(error) {
      // handle your errors here
  }
}