使用Q延迟有什么好处?

时间:2015-01-04 18:36:15

标签: javascript promise q

我是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;

1 个答案:

答案 0 :(得分:3)

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()和上面的模式都很有用。如果您在代码中使用promises,那么对所有异步代码使用promises而不是混合和匹配是个好主意。 Q.Promise()构造函数和Q.defer()可以弥补这一差距。

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

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

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