Javascript 从承诺中解析价值的哪种方法是正确的?
我还不熟悉JavaScript中的所有异步内容,在处理一些承诺时遇到了一些混乱的情况。以下是我当前的代码:Javascript 从承诺中解析价值的哪种方法是正确的?,javascript,ecmascript-6,promise,Javascript,Ecmascript 6,Promise,我还不熟悉JavaScript中的所有异步内容,在处理一些承诺时遇到了一些混乱的情况。以下是我当前的代码: exists(filename, targetDir){ const filepath = path.join(targetDir || this.getTargetDir(), filename); // plug in any one method from below } 当我查看其他人的代码时,我看到他们解析如下值(插入上面的代码): 在这种情况下,哪些是正确的?
exists(filename, targetDir){
const filepath = path.join(targetDir || this.getTargetDir(), filename);
// plug in any one method from below
}
当我查看其他人的代码时,我看到他们解析如下值(插入上面的代码):
在这种情况下,哪些是正确的?哪些是不正确的?这取决于场景吗?推荐哪一种?一个好的解释将不胜感激,谢谢
澄清:exists
是一个类方法,它返回一个解析为布尔值的承诺,其中true
表示URL存在,false
表示它不存在
澄清#2:存在
如果出现错误,应解决为false
。方法3是最好的。
下一个.then()
接收当前.then()
返回的内容。如果此返回值恰好是一个承诺,则在承诺解析后执行下一个.then()
使用方法3,您将能够将其他.then()
附加到当前链:
exists('test.txt', '/')
.then(doesExist => console.log(doesExist ? 'The file exists.' : 'The file doesn\'t exist.'));
方法1和方法4也可以实现这一点,但方法1不必要地将值包装在承诺中,承诺将立即解决
方法4不必要地将整个请求包装在承诺中。这就是所谓的
方法2不允许承诺链接。您不能使用包装在Promise.resolve
中的值,因为.then()
和.catch()
隐式返回未定义的方法3是最好的。
下一个.then()
接收当前.then()
返回的内容。如果此返回值恰好是一个承诺,则在承诺解析后执行下一个.then()
使用方法3,您将能够将其他.then()
附加到当前链:
exists('test.txt', '/')
.then(doesExist => console.log(doesExist ? 'The file exists.' : 'The file doesn\'t exist.'));
方法1和方法4也可以实现这一点,但方法1不必要地将值包装在承诺中,承诺将立即解决
方法4不必要地将整个请求包装在承诺中。这就是所谓的
方法2不允许承诺链接。您不能使用包装在Promise.resolve
中的值,因为.then()
和.catch()
隐式返回未定义的
- 方法1是正确的,但不必要地复杂
- 方法2显然是错误的。
您可以创建新的承诺,但它们不会在任何地方填充,因此在函数结束时它们会被释放。
这相当于:
return request(this.getUrl(filepath)).catch(err => undefined);
- 方法3是最好的方法
- 方法4也将解析为corect值,但它是一个反模式。
- 方法1是正确的,但不必要地复杂
- 方法2显然是错误的。
您可以创建新的承诺,但它们不会在任何地方填充,因此在函数结束时它们会被释放。
这相当于:
return request(this.getUrl(filepath)).catch(err => undefined);
- 方法3是最好的方法
- 方法4也将解析为corect值,但它是一个反模式。
@guest271314基本上,我试图找出从承诺中解析值的方法是正确的。第一种方法和第三种方法是正确的,并执行相同的操作thing@guest271314,则传递给
的回调应返回承诺,若返回的不是承诺,则结果将被包装。所以,在第一种方法中,只需这样做manually@guest271314,是的,如果这已经不是一个承诺,那么,如果您返回承诺,就像在第一个方法中一样,这个值将不会包装在另一个方法中promise@guest271314对exists
应返回解析为true
或false
的承诺@guest271314基本上,我正在尝试找出解析承诺值的哪种方法是正确的。第一种和第三种方法是正确的,并执行相同的操作thing@guest271314,回调传递给,然后
应返回承诺,若它并没有得到承诺,那个么结果就会被包装起来。所以,在第一种方法中,只需这样做manually@guest271314,是的,如果这已经不是一个承诺,那么,如果您返回承诺,就像在第一个方法中一样,这个值将不会包装在另一个方法中promise@guest271314对exists
应返回解析为true
或false
的承诺。请注意中的返回false
。方法3中的catch()
将在链接的处生成解析的承诺值。然后()
-链接的.catch()
无法联系到我想这是故意的exists
如果文件存在,则应返回承诺wrappingtrue
;如果文件不存在或存在错误,则应返回wrappingfalse
.catch()
s afterexists
只应处理中发生的错误。then()
s after exists.。如果文件不存在,则包装为false。如何访问.catch()
呢?请澄清特定的.catch()
在哪里?请参见问题代码处的方法3的要点.catch(()=>{return false;})
将在链接的处产生已解析的Promise
。然后()
注意中的返回false
。方法3处的catch()
将在链接的处产生已解析的Promise
值。然后()
-链接的。catch()
将无法访问。我想这是有意的exists
如果文件存在,则应返回承诺wrappingtrue
;如果文件不存在或存在错误,则应返回wrappingfalse
.catch()
s afterexists
应仅处理中发生的错误。然后()
s after exists.”如果文件存在,则包装为false