我一生都在承诺中使用以下代码模式:
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,他们总是会返回相同的输出并在相同条件下具有相同的行为吗?)
答案 0 :(得分:4)
我的方法和我的学生方法之间有什么区别(如果有的话),代码功能明智吗?
在这种具体情况中,没有任何原因,原因有三个:
传递给Promise执行者的resolve
和reject
函数(您传递的函数new Promise
)are defined as返回undefined
。因此,return resolve(...)
实际上是resolve(...); return undefined;
Promise构造函数doesn't use the return value of the executor,所以即使#1不正确,它仍然无关紧要。
在函数中,return;
和return undefined;
之间的差异出现在规范级别,但在代码中不可观察。也就是说,在代码中,它们完全相同,即使规范稍微区分它们。
值得注意的是,虽然它没有使功能产生差异,但它会产生语义差异。 return resolve(...)
说“call resolve
并返回其返回值” - 表明该返回值对代码有意义和重要性。它没有,因此return resolve(...)
会误导以后维护代码的人。作为一种风格问题,我不推荐它。 (请注意,如果它变得很普通,它就会变成一个成语,通过了解成语来解决这个问题,但是......)如果保存这条线对你很重要,那就去resolve(...); return;
(或者更好) ,不要担心额外的行,或者让你的逻辑根本不需要return
。但你的问题是关于功能的差异,所以......
那就是说,将此概括为其他情况是危险的,因为您调用的函数可能不会返回undefined
,或者使用函数的返回值。
答案 1 :(得分:1)
它们将始终以完全相同的方式运行,是的,因为传递给执行程序的resolve
和reject
函数返回undefined
和return undefined
等同于{ {1}}(并且promise构造函数不使用您返回的值)。
通常,您根本不想使用return
构造函数。这个看起来像是可以使用Promise
和Promise.resolve
的东西,例如:
Promise.reject
答案 2 :(得分:0)
两个代码示例没有区别,它们的行为完全相同。唯一的区别是,如果您必须在解析/拒绝之前执行其他逻辑,例如,清除变量,第一种方法会更具可读性。除此之外,它只是可读性。如果您只需要在条件
内执行1行,则可以删除条件码周围的{}答案 3 :(得分:0)
当我们异步进行的操作时,我们调用resolve(...) 成功,并在失败时拒绝(...)。
所以,是的,代码示例将始终返回相同的内容,但另一个人提到它不是一个非常好的代码片段。