问:Promisify同步操作链接承诺?

时间:2015-05-11 03:41:03

标签: promise q chaining

在同步操作中是否有任何优点,以便通过设计将它们链接到onSuccess或onError回调中?

例如:

function loadSettings(path) {
    if (fs.existsSync(path)) {
        return Q(fsJson.loadSync(path));
    }
    return new Q.defer().reject('No local settings!');
}

doingSomethingFirst()
    .then(loadSettings, obtainSettings)
    .then(doSomethingWithSettings)
    .done()

什么是最好的?

2 个答案:

答案 0 :(得分:2)

不,此外,它给人以错误的印象,即这些方法是异步的,因此您或其他开发人员可能会调用它们,并期望该方法不会通过执行同步IO来破坏整个io.js / node.js并发模型。 / p>

我建议您使这些函数不返回promises或使它们执行异步IO。另请注意,您的方法具有竞争条件(如果在您检查文件存在和尝试访问文件之间删除文件,该怎么办?)

答案 1 :(得分:2)

实际上,即使你这样编写loadSettings,这个特定链也会完全相同:

function loadSettings(path) {
    if (fs.existsSync(path)) {
        return fsJson.loadSync(path);
    }
    throw 'No local settings!';
}

请注意,拒绝使用字符串或抛出字符串是一种可怕的做法,所以理想情况下你需要new Error('No local settings!')。我的意思是想象一下,如果错误实际发生并且它只是一个字符串 - 你根本不知道错误的发生方式和位置。