Javascript Q.fcall和(Q.defer&x2B;Q.resolve+;Q.promise)/Q库之间的差异
例1Javascript Q.fcall和(Q.defer&x2B;Q.resolve+;Q.promise)/Q库之间的差异,javascript,q,Javascript,Q,例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 (
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中,我们没有这两个例子是类似的,但是,在第一个例子中,您采用了一个非承诺函数,而第二个直接返回一个承诺。如果您在编写自己的函数时总是希望返回承诺,则最好使用第二个示例。然而,如果函数要在非基于承诺的上下文中使用,那么这当然是以适应性为代价的
Q.fcall
更常用于使第三方功能适应基于承诺的范例
这里还有第三个例子,您也可以使用(这是我在编写基于承诺的库时首选的方法):
这将通过使用以下命令删除对Q.defer()
的一些不必要的调用:
Q(值)
如果值是Q承诺,则返回承诺
如果值是来自另一个库的承诺,那么它将被强制转换为Q
承诺(在可能的情况下)
如果值不是承诺,则返回使用
价值观
Q.拒绝(原因)
返回有理由拒绝的承诺
还值得注意的是,Q包含一整套方法,用于将不同类型的函数、方法、nodejs风格的回调等适应于基于Q promise的系统。其中许多在自述文件中没有提到。ye ik,然后一些人想知道为什么大多数人完全忽略自述文件
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);
});