解决/拒绝承诺,有什么区别?

时间:2017-10-16 10:31:26

标签: javascript promise

故事

我一生都在承诺中使用以下代码模式:

const => new Promise((resolve, reject) => {
    //do some work
    if(err !== undefined){
        reject(err);
        return;
    }

    if(someCondition){
        resolve(1);
        return;
    }

    resolve(2);
});

然而,最近我的一个学生向我提出了一个有趣的代码:

const => new Promise((resolve, reject) => {
    //do some work
    if(err !== undefined) return reject(err);

    if(someCondition) return resolve(1);

    resolve(2);
});

我的第一反应是:"你应该按我的方式去做因为...(沉默跟着)"

问题

我试图找到差异的逻辑解释,但我找不到。

我尝试检查Promise的MDN文档,看看解析或拒绝是否可以返回undefined以外的其他内容,但我也找不到它。

问题:

所以现在我有一个问题:   - 我的方法和我的学生方法之间有什么区别(如果有的话),代码功能明智吗? (AKA,他们总是会返回相同的输出并在相同条件下具有相同的行为吗?)

4 个答案:

答案 0 :(得分:4)

  

我的方法和我的学生方法之间有什么区别(如果有的话),代码功能明智吗?

这种具体情况中,没有任何原因,原因有三个:

  1. 传递给Promise执行者的resolvereject函数(您传递的函数new Promiseare defined as返回undefined。因此,return resolve(...)实际上是resolve(...); return undefined;

  2. Promise构造函数doesn't use the return value of the executor,所以即使#1不正确,它仍然无关紧要。

  3. 在函数中,return;return undefined;之间的差异出现在规范级别,但在代码中不可观察。也就是说,在代码中,它们完全相同,即使规范稍微区分它们。

  4. 值得注意的是,虽然它没有使功能产生差异,但它会产生语义差异。 return resolve(...)说“call resolve并返回其返回值” - 表明该返回值对代码有意义和重要性。它没有,因此return resolve(...)会误导以后维护代码的人。作为一种风格问题,我不推荐它。 (请注意,如果它变得很普通,它就会变成一个成语,通过了解成语来解决这个问题,但是......)如果保存这条线对你很重要,那就去resolve(...); return;(或者更好) ,不要担心额外的行,或者让你的逻辑根本不需要return。但你的问题是关于功能的差异,所以......

    那就是说,将此概括为其他情况是危险的,因为您调用的函数可能不会返回undefined,或者使用函数的返回值。

答案 1 :(得分:1)

它们将始终以完全相同的方式运行,是的,因为传递给执行程序的resolvereject函数返回undefinedreturn undefined等同于{ {1}}(并且promise构造函数不使用您返回的值)。

通常,您根本不想使用return构造函数。这个看起来像是可以使用PromisePromise.resolve的东西,例如:

Promise.reject

答案 2 :(得分:0)

两个代码示例没有区别,它们的行为完全相同。唯一的区别是,如果您必须在解析/拒绝之前执行其他逻辑,例如,清除变量,第一种方法会更具可读性。除此之外,它只是可读性。如果您只需要在条件

内执行1行,则可以删除条件码周围的{}

答案 3 :(得分:0)

From the MDN

  

当我们异步进行的操作时,我们调用resolve(...)   成功,并在失败时拒绝(...)。

所以,是的,代码示例将始终返回相同的内容,但另一个人提到它不是一个非常好的代码片段。