首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Q.fcall与(Q.defer + Q.resolve + Q.promise) /Q库的差异

Q.fcall与(Q.defer + Q.resolve + Q.promise) /Q库的差异
EN

Stack Overflow用户
提问于 2016-06-09 10:27:05
回答 1查看 364关注 0票数 4

示例1

代码语言:javascript
复制
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

代码语言:javascript
复制
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中,我们没有

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-21 12:19:08

这两个例子是相似的,然而,在第一个例子中,您正在适应一个基于非承诺的函数,而第二个则直接返回一个承诺。如果您在编写自己的函数时总是希望返回承诺,那么您的第二个示例将得到优先考虑。然而,如果要在基于不承诺的上下文中使用这些功能,当然,这是以适应性为代价的。Q.fcall更多地用于使第三方函数适应基于承诺的范式。

这里还有第三个例子(这是我在编写基于承诺的库时首选的方法):

代码语言:javascript
复制
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引用中没有提到其中的许多内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37723363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档