Q.fcall和(Q.defer + Q.resolve + Q.promise)/ Q Library之间的区别

时间:2016-06-09 10:27:06

标签: 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 (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>我们不

1 个答案:

答案 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中提及。