Javascript Q.fcall和(Q.defer&x2B;Q.resolve+;Q.promise)/Q库之间的差异

Javascript 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 (

例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中,我们没有这两个例子是类似的,但是,在第一个例子中,您采用了一个非承诺函数,而第二个直接返回一个承诺。如果您在编写自己的函数时总是希望返回承诺,则最好使用第二个示例。然而,如果函数要在非基于承诺的上下文中使用,那么这当然是以适应性为代价的
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);
    });