问:用于链接承诺的 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!')
。我的意思是想象一下如果该错误真的发生了并且它只是一个字符串 - 您将不知道错误是如何发生的或在哪里发生的。
承诺同步操作是否有任何优点,以便通过设计将它们链接到 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!')
。我的意思是想象一下如果该错误真的发生了并且它只是一个字符串 - 您将不知道错误是如何发生的或在哪里发生的。