Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从承诺中解析价值的哪种方法是正确的?_Javascript_Ecmascript 6_Promise - Fatal编程技术网

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 } 当我查看其他人的代码时,我看到他们解析如下值(插入上面的代码): 在这种情况下,哪些是正确的?

我还不熟悉JavaScript中的所有异步内容,在处理一些承诺时遇到了一些混乱的情况。以下是我当前的代码:

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
      如果文件存在,则应返回承诺wrapping
      true
      ;如果文件不存在或存在错误,则应返回wrapping
      false
      .catch()
      s after
      exists
      只应处理
      中发生的错误。then()
      s after exists.。如果文件不存在,则包装为false。如何访问
      .catch()
      呢?请澄清特定的
      .catch()
      在哪里?请参见问题代码处的方法3的要点
      .catch(()=>{return false;})
      将在链接的
      处产生已解析的
      Promise
      。然后()
      注意
      中的
      返回false
      。方法3处的catch()
      将在链接的
      处产生已解析的
      Promise
      值。然后()
      -链接的
      。catch()
      将无法访问。我想这是有意的
      exists
      如果文件存在,则应返回承诺wrapping
      true
      ;如果文件不存在或存在错误,则应返回wrapping
      false
      .catch()
      s after
      exists
      应仅处理
      中发生的错误。然后()
      s after exists.”如果文件存在,则包装为false