【发布时间】:2017-08-13 17:35:59
【问题描述】:
我对 JavaScript 中的所有这些异步内容仍然很陌生,并且在处理一些 Promise 时遇到了一些令人困惑的情况。这是我当前的代码:
exists(filename, targetDir){
const filepath = path.join(targetDir || this.getTargetDir(), filename);
// plug in any one method from below
}
当我查看其他人的代码时,我看到他们解析这样的值(插入上面的代码):
// method 1
return request(this.getUrl(filepath))
.then(res => {
return Promise.resolve(res.statusCode === 200);
})
.catch(() => {
return Promise.resolve(false);
});
// method 2
return request(this.getUrl(filepath))
.then(res => {
Promise.resolve(res.statusCode === 200);
})
.catch(() => {
Promise.resolve(false);
});
// method 3
return request(this.getUrl(filepath))
.then(res => {
return res.statusCode === 200;
})
.catch(() => {
return false;
});
// method 4
return new Promise((resolve, reject) => {
request(this.getUrl(filepath))
.then(res => {
resolve(res.statusCode === 200);
}
.catch(() => {
resolve(false);
};
});
在这种情况下哪些是正确的?哪些是不正确的?这取决于场景吗?推荐其中哪一种?一个很好的解释将不胜感激,谢谢!
澄清: exists 是一个类方法,它返回一个解析为布尔值的 Promise,其中true 表示 URL 存在,false 表示它不存在.
澄清 #2: 如果发生错误,exists 应解析为 false。
【问题讨论】:
-
@guest271314 基本上我试图找出从承诺中解析值的哪种方法是正确的。
-
第一种和第三种方法都是正确的,做同样的事情
-
@guest271314,回调传递给
then应该返回Promise,如果它返回的不是Promise,那么result就会被包装。因此,在第一种方法中,只需手动执行此操作 -
@guest271314,是的,如果这已经不是一个承诺,那么,如果你返回 Promise,就像在第一个方法中一样,这个值不会被包装在另一个承诺中
-
@guest271314 是的,
exists应该返回一个解析为true或false的 Promise。
标签: javascript ecmascript-6 promise