function getPropsPromise(prop) {
return new Promise(resolve => {
resolve(prop());
});
}
如果我在上面的“ promisifying”函数中包装了一个同步方法:
function docProps() {
const data = {};
data['doc.title'] = document.title;
return data;
}
像这样:
getPropsPromise(docProps)
这是否构成对Promises的错误应用?本质上,将Promises用于与网络无关的任何内容是否可以接受?如果这样的话,最好直接从'docProps'函数返回一个Promise,如下所示,还是'promisize'它的调用具有相同的目的?
function docProps() {
const data = {};
data['doc.title'] = document.title;
return new Promise(resolve => { resolve(data) };
}
答案 0 :(得分:2)
这是否构成对Promises的错误应用?本质上,将Promises用于与网络无关的任何内容是否可以接受?
否,可以将诺言用于非网络任务。当读取文件,超时,异步处理,异步流等时,也可以使用它。
如果这样的话,最好直接从docProps函数中返回一个Promise,如下所示,或者“ promisize”其调用具有相同的目的吗?:
它们是等效的,但是如果docProps
返回了一个承诺并且您也将其包装在getPropsPromise
承诺中,那将是多余的。另外,您的getPropsPromise
可以用标准的Promise.prototype.resolve
方法代替。即
function getPropsPromise(prop) {
return new Promise(resolve => {
resolve(prop());
});
}
getPropsPromise(func);
等同于
Promise.resolve(func());
最后,除非您的docProps
是为该问题创建的虚拟人/占位符,否则就不会有任何异步。您提供的摘录中似乎根本不需要承诺。
答案 1 :(得分:1)
如果docProps
是常规同步函数,那么执行此操作只会使程序变慢,因此您一无所获。 Promise中的同步代码仍将与所有其他代码在同一线程上运行,因此仍会阻塞。
如果docProps
是异步的,则它将返回一个Promise或进行一个回调。如果它返回一个承诺,则将其包装在另一个承诺中是一种反模式。如果需要回调,则更正模式将是在回调中调用resolve
,例如:
function getPropsPromise(prop) {
return new Promise(resolve => {
prop(() => {
/* do stuff */
resolve(/*something*/)
});
});
}
因此,无论哪种方式,除非您有期望的承诺并且只有同步功能,否则很难看到发布的代码的良好用例。在这种情况下,最好使用Promise.resolve()