【发布时间】:2019-04-17 22:45:22
【问题描述】:
function getPropsPromise(prop) {
return new Promise(resolve => {
resolve(prop());
});
}
如果我在上面的“promisifying”函数中封装了一个同步方法:
function docProps() {
const data = {};
data['doc.title'] = document.title;
return data;
}
像这样:
getPropsPromise(docProps)
这是否构成对 Promise 的错误应用?本质上,将 Promises 用于任何与网络无关的事情是否可以接受?如果是这样,那么直接从“docProps”函数返回一个 Promise 会更好,还是“承诺”它的调用服务于相同的目标?:
function docProps() {
const data = {};
data['doc.title'] = document.title;
return new Promise(resolve => { resolve(data) };
}
【问题讨论】:
-
当然,为什么不呢,你可以用
return Promise.resolve( data )做,或者让 docPropsasync隐含地让它返回一个承诺......承诺中的长期运行方法仍然阻塞,看到 javascript 是单线程的,如果真的需要,那么你可以使用 webworker -
Promises 的应用绝对没有错误,已经有一些库这样做了(例如bluebird。我不认为你的任何一个例子更好,只是不同,在第一种情况下你有通用函数,可以承诺任何其他函数并且可以重用,在第二个它只是函数返回承诺
-
如果您使用
Promise,则意味着您正在尝试解决问题,而Promise是这样做的工具。通过Promise解决的问题是避免阻塞主线程直到I/O 操作完成。在我们的浏览器中,网络和文件读取是依赖于网络或硬盘驱动器的任务,并且比计算任务慢得多 - 因此,它们会导致浏览器挂起直到完成。除非您有两个以不同速度移动的 "pieces",否则使用Promise并不能真正解决任何问题,也不会破坏任何东西。您的示例不需要承诺。
标签: javascript