示例1
function first(a, b) {
return a + b;
}
function second() {
return Math.floor(Math.sqrt(arguments[0]));
}
function third() {
return Math.PI * (arguments[0]);
}
Q.fcall(first, 3, 4)
.then(second)
.then(third)
.then(function (result) {
console.log(result);
});
示例2
function first(a, b) {
var d = Q.defer();
if (isNaN(a) || isNaN(b)) {
d.reject('Wrong Numbers');
} else {
d.resolve(a + b);
}
return d.promise;
}
function second() {
return Math.floor(Math.sqrt(arguments[0]));
}
function third() {
return Math.PI * (arguments[0]);
}
first(3, 4)
.then(second)
.then(third)
.then(function (result) {
console.log(result);
}, function (error) {
console.log(error);
});
那么这两个例子之间的区别是什么,因为根据我自己能够理解的是,使用示例2 ,我们有错误和成功处理程序,并且在示例1 < / em>我们不
答案 0 :(得分:2)
这两个例子是类似的,但是,在第一个例子中,你正在调整一个非基于承诺的函数,而第二个例子直接返回一个promise。如果您正在编写自己的函数,而您总是希望返回promise,那么您的第二个示例将是首选。然而,如果要在非承诺的背景下使用这些功能,这当然会以适应性为代价。 Q.fcall
更常用于使第三方功能适应基于承诺的范例。
这是您可以使用的第三个示例(这是我在编写基于承诺的库时首选的做法):
function first(a, b) {
if (isNaN(a) || isNaN(b)) {
return Q.reject('Wrong Numbers');
} else {
return Q(a + b);
}
}
function second() {
return Q(Math.floor(Math.sqrt(arguments[0])));
}
function third() {
return Q(Math.PI * (arguments[0]));
}
first(3, 4)
.then(second)
.then(third)
.then(function (result) {
console.log(result);
})
.fail(function (error) {
console.log(error);
});
通过使用以下内容删除了对Q.defer()
的一些不必要的调用:
问(值)强>
如果value是Q promise,则返回promise。
如果value是来自另一个库的promise,则会被强制转换为Q. 承诺(如果可能)。
如果value不是promise,则返回一个履行的promise 值。
<强> Q.reject(原因)强>
返回因理由而被拒绝的承诺。
值得注意的是,Q包含许多方法来使不同类型的函数,方法,nodejs样式回调等适应基于Q promise的系统。其中许多内容未在自述文件instead check the API reference中提及。