同步代码是否在Promise阻止中?

时间:2019-04-17 14:29:16

标签: javascript

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) };
}

2 个答案:

答案 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()