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

Q: Promisify Synchronous operations for chaining promises?

承诺同步操作是否有任何优点,以便通过设计将它们链接到 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()

什么最好?

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

我建议您要么让这些功能不 return 承诺,要么让它们执行异步 IO。还要注意你的方法有一个竞争条件(如果文件在你检查它存在和你尝试访问它之间被删除怎么办?)

实际上,即使您这样写 loadSettings,这个特定链的工作方式也完全相同:

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

请注意,使用字符串拒绝或抛出字符串是一种可怕的做法,因此理想情况下您会想要 new Error('No local settings!')。我的意思是想象一下如果该错误真的发生了并且它只是一个字符串 - 您将不知道错误是如何发生的或在哪里发生的。