javascript - q then 与 2 个函数和 then 后跟 catch 之间的区别

标签 javascript node.js promise q

只是一个快速澄清的问题:

有什么区别吗

promiseGeneratingFunction.then(successHandler, errorHandler).done();

promiseGeneratingFunction.then(successHandler).catch(errorHandler).done();

谢谢

最佳答案

是的,这两个例子是不同的。

其他答案没有考虑链接的影响。文档说:

A sugar method, equivalent to promise.then(undefined, onRejected).

所以,是的,.catch 相当于 .then。但这不是您的示例所显示的。

你比较

promiseGeneratingFunction.then(successHandler, errorHandler).done();

// VS

promiseGeneratingFunction.then(successHandler).catch(errorHandler).done();

如果我们使用记录的比较来分解第二个示例,它实际上是:

promiseGeneratingFunction.then(successHandler, errorHandler).done();

// VS

promiseGeneratingFunction.then(successHandler).then(undefined, errorHandler).done();

这两者在处理错误的方式上表现不同。如果生成的 Promise 成功,这两个示例都会调用 successHandler,如果 Promise 失败,则会调用 errorHandler,因此它们非常相似。区别在于它们在 successHandler 中处理错误的方式。

// this is a fulfilled promise since the thrown error was handled
Promise.resolve().then(function(){ throw new Error(); }).catch(function(){});

// this is a rejected promise
Promise.resolve().then(function() { throw new Error() }, function(){});

如果您的 successHandler 函数要抛出异常(或返回被拒绝的 Promise),则您的第一个示例没有附加错误处理程序(errorHandler 仅附加到 promiseGenerateFunction,因此您的 Promise 将从 .done() 抛出未捕获的异常。在第二个示例中,从 successHandler 抛出的错误也将在 errorHandler 中捕获,因为它被绑定(bind)在 promise 链的更下游。

等效的同步代码如下所示:

var error = null;
var result;

try {
    result = func();
} catch (err){
    error = err;
}

if (error){
    errorHandler(error);
} else {
    successHandler(result);
}

// VS

try {
    var result = func();

    successHandler(result);
} catch (err){
    errorHandler(err);
}

关于javascript - q then 与 2 个函数和 then 后跟 catch 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25344825/

相关文章:

javascript - 无法在控制台中删除变量

node.js - ENOENT : no such file or directory when running npm install command

javascript - 如何删除shortId中的特殊字符

javascript - Promise 扩展到更多的 Promise 会导致不可预测的数据格式(以及不可读的代码)

javascript - HTML5 视频 - 设置 video.currentTime 会破坏播放器

javascript - 在生产中使用 node.js?

javascript - 从查询字符串中删除 '+'

javascript - 基于对象值列表的新对象

node.js - 使用 Google gmail api 是否需要 credentials.json?

javascript - 在 Protractor 中传播 promise