【问题标题】:what is the benefit to use Q defer?使用 Q defer 有什么好处?
【发布时间】:2015-01-05 04:01:13
【问题描述】:

我是 Q.lib 的新手

我们什么时候需要使用 Q.defer ?

有什么好处?

我们可以用 q.defer 返回承诺吗?

 var deferred = Q.defer();
FS.readFile("foo.txt", "utf-8", function (error, text) {
if (error) {
    deferred.reject(new Error(error));
} else {
    deferred.resolve(text);
}
 });
  return deferred.promise;

【问题讨论】:

标签: javascript promise q


【解决方案1】:

Q 库的主要作者之一写了an article,指出Q.defer() 不自然且过时(尽管它仍有一些实际应用)。

更现代的方法(这是本文所要讨论的)是显示构造函数模式。这也是 ES6 Promise 标准中的方法(defer 未包含在标准中),因此最好在可用时使用它:

return Q.Promise(function (resolve, reject) {
    FS.readFile("foo.txt", "utf-8", function (error, text) {
        if (error) {
            reject(new Error(error));
        } else {
            resolve(text);
        }
    });
});

但是要了解(我认为是)您问题的要点,当您想从不产生承诺的异步 API 创建承诺时,Q.defer() 和上述模式都很有用。如果您在代码中使用 Promise,最好对所有异步代码使用 Promise,而不是混合和匹配。 Q.Promise() 构造函数和 Q.defer() 可以让您弥合这一差距。

注意:由于您使用的是 Node 风格的 API,因此有一种更简单的技术专门为此而设计。您可以使用Q.nfbind 将节点样式的异步函数转换为返回承诺的函数:

var readFile = Q.nfbind(FS.readFile);

readFile("foo.txt", "utf-8").then(function (data) {
    console.log("Got the file!");
});

【讨论】:

    猜你喜欢
    • 2021-10-10
    • 2013-01-06
    • 2018-01-18
    • 2012-11-28
    • 2010-09-21
    • 2011-04-28
    • 1970-01-01
    • 2011-09-16
    • 2011-04-24
    相关资源
    最近更新 更多