Bluebird Promise:any()集合返回值undefined

时间:2015-10-25 21:41:24

标签: javascript promise

使用bluebird promises,我试图检查文件的某个版本是否存在(这些文件中只有一个存在,但我不知道哪个文件存在)。为了加快速度,我使用any()集合来同时检出所有内容:

 Promise.any([
     fs.existsAsync('./foo/image1.jpg'),
     fs.existsAsync('./foo/image2.gif'),
     fs.existsAsync('./foo/image3.png')
 ]).then(function(result) {
     console.log(result); //remains undefined
 });

我总是得到一个未定义的结果。根据(How do I return the response from an asynchronous call?),这是已解决的承诺的正常行为。不过,我需要知道,我的三个承诺中的哪一个已经解决,或者我可能不能为此目的使用任何()?

1 个答案:

答案 0 :(得分:1)

fs.exists()的回调不遵循callback(err, value)的预期调用约定,因此它不适用于通用promisify。它仅使用callback(value)

您可以改为使用fs.statAsync(),也可以为fs.exists()创建自己的可以正常使用的宣传方式。

当然,fs.exists()因种族原因而被弃用,所以你或许应该在这里重新考虑你的策略。

这是一个适当宣传的fs.existsAsync()

fs.existsAsync = function(path) {
    return new Promise(function(resolve) {
        fs.exists(path, resolve);
    });
}

在完成fs模块的一般宣传后,您将分配此项,以替换Bluebird自动执行的错误fs.existsAsync