2017-05-08 59 views
0

请原谅我的noobness,但为什么这不工作? then()永远不会被解雇,也不会是error()。承诺似乎永远不会解决。Bluebird Promisify execFile无法承诺解决

任何指针赞赏。谢谢。

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)); 
+0

您不能将回调传递给promisfied函数。你不应该自己调用'new Promise'构造函数。 – Bergi

+0

谢谢您的评论,但这并不能帮助我。 – Simon

回答

3

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

你应该做的事:

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 
}); 
+0

感谢您花时间回答我的问题。 – Simon

2

我非常感谢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 
    } 
}