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
});
如果您需要同时访问 stdout
和 stderr
,则必须将 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
}
}
请原谅我的笨拙,但为什么这不起作用?
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
});
如果您需要同时访问 stdout
和 stderr
,则必须将 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
}
}