示例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中,我们没有
发布于 2017-03-21 12:19:08
这两个例子是相似的,然而,在第一个例子中,您正在适应一个基于非承诺的函数,而第二个则直接返回一个承诺。如果您在编写自己的函数时总是希望返回承诺,那么您的第二个示例将得到优先考虑。然而,如果要在基于不承诺的上下文中使用这些功能,当然,这是以适应性为代价的。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(值) 如果值是q承诺,则返回允诺。 如果值是来自另一个库的承诺,那么它将被强制进入Q承诺(在可能的情况下)。 如果价值不是承诺,则返回以价值实现的承诺。 Q.reject(reason) 返回有理由被拒绝的承诺。
还值得注意的是,Q包含了大量的方法来适应不同类型的函数、方法、nodejs风格的回调等,以适应基于Q承诺的系统。在自述文件相反,请检查API引用中没有提到其中的许多内容。
https://stackoverflow.com/questions/37723363
复制相似问题