Q.call和(Q.defer+Q.resolve+Q.promise)/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 (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中,我们没有

这两个例子是类似的,但是,在第一个例子中,您正在调整一个非基于promise的函数,而第二个例子直接返回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()的一些不必要的调用:

Q(值)

如果value是Q promise,则返回promise。

如果value是来自另一个库的promise,则它被强制为Q承诺(在可能的情况下)。

如果value不是promise,则返回用实现的promise价值

Q.ject(原因)

返回一个被合理拒绝的承诺。

还值得注意的是,Q包含一整套方法,用于将不同类型的函数、方法、nodejs风格的回调等适应基于Q promise的系统。自述中没有提到其中的许多内容,而是查看API参考资料。

相关内容

  • 没有找到相关文章

最新更新