关于Promise的定义……可以参考Promises/A - CommonJS Wiki
现在npm上也有很多promise的库了,在下用的deferred(比较类似Q)。
首先谈谈在下的看法:
Promise是把原来靠异步回调取得的值做成一个返回值的形式,使这个值能够直接作用于上下文(上下文都支持Promise的情况下)来消解callback hell(最终只用一个callback来获取promise的结果)。
在下感觉这种“把同步传值的过程应用到异步调用中”的思路是很不错的,
但是Promise里面只有then
这一种流控制,因此只能做既定的工作(?)比如把如下的异步调用代码(引用自You’re Missing the Point of Promises)
getTweetsFor("domenic") // promise-returning async function
.then(function (tweets) {
var shortUrls = parseTweetsForUrls(tweets);
var mostRecentShortUrl = shortUrls[0];
return expandUrlUsingTwitterApi(mostRecentShortUrl); // promise-returning async function
})
.then(doHttpRequest) // promise-returning async function
.then(
function (responseBody) {
console.log("Most recent link text:", responseBody);
},
function (error) {
console.error("Error with the twitterverse:", error);
}
);
使用promise改写为
try {
var tweets = getTweetsFor("domenic"); // blocking
var shortUrls = parseTweetsForUrls(tweets);
var mostRecentShortUrl = shortUrls[0];
var responseBody = doHttpRequest(expandUrlUsingTwitterApi(mostRecentShortUrl)); // blocking x 2
console.log("Most recent link text:", responseBody);
} catch (error) {
console.error("Error with the twitterverse: ", error);
}
对于这种一步一步逐层回调往下执行的代码来说,Promise的实现是非常优雅的。可是对于需要通过某一步的计算结果来决定下一步的动作的代码来说(执行流里面出现了分支或者循环),又会出现嵌套的回调语句(因为需要取出值来判断,所以这里产成一个回调,然后回调里面又是新的一串promise操作……),这样一来当代码里面的分支/循环变多了以后还是会出现callback hell的状况……【不知道大家对于这种情况是如何解决的呢?
所以在下认为Promise这个模式还有可以改进的余地或者什么的……【又或者是在下的用法不对……