2015-01-04 79 views
-1

我是新來的Q. lib使用Q延遲有什麼好處?

我們什麼時候需要使用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

你難道不明白哪一部分的文件? – SLaks

+0

[**如何將現有的回調API轉換爲承諾**](http://stackoverflow.com/questions/22519784/how-do-i-convert-an-existing-callback-api-to -promises)。 –

回答

3

一個第q庫的主要作者寫an article指出Q.defer()是不自然的,過時的(雖然它仍然有一些實際應用)。

更現代的方法(這是文章的內容)是揭示構造函數模式。這也是在ES6無極標準(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,那麼對所有異步代碼使用promises而不是混合和匹配是一個好主意。 Q.Promise()構造函數和Q.defer()允許您填補這一空白。

注:因爲你是一個節點式API的工作,還有一個更簡單的技術專爲此設計的。您可以使用Q.nfbind到節點式異步函數轉換成返回承諾的功能:

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

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