【问题标题】:.then() method ignored when using ES5 syntax.then() 方法在使用 ES5 语法时被忽略
【发布时间】:2019-05-13 15:42:23
【问题描述】:

让这段代码正常工作,带有箭头功能:

f0(value)
    .then(val1          => f1(val1))
    .then(val2          => f2(val2))
    .catch(error        => result.textContent = error)
    .then(()            => final.textContent = "Done");

我正在尝试使用常规函数对其进行版本控制,如下所示:

f0(value)
    .then(function(val1){    f1(val1) })
    .then(function(val2){    f2(val2) })
    .catch(function(error){  result.textContent = error })
    .then(function(){        final.textContent = "Done" });

代码似乎忽略了任何被拒绝的 Promise,所以如果第一个 .then() 被拒绝,它会继续调用第二个,依此类推。

这不会发生在上面的 ES6 示例中。

我犯了一些语法错误吗?

【问题讨论】:

  • 这是因为您在 then 块下没有返回任何内容。 .then(function(val1){ return f1(val1) })
  • 谢谢你,安娜,发表你的回复,我会打勾
  • 不客气。

标签: function ecmascript-6 promise


【解决方案1】:

我认为你应该有一个 then() 和一个 catch() 方法来实现一个signle promise。如果您需要多个处理程序,请尝试将它们包装在一个函数中。

【讨论】:

  • 这是一个 thenable 结构,你可以链接几个 .then() 方法,第一个例子可以正常工作
  • 我认为您缺少第二种方式的return语句
  • .then() 的全部意义在于它们可以被链接。否则你可以只使用回调。
【解决方案2】:

您缺少return 声明。
相当于:

val1 => f1(val1)

是:

function(val1){  return  f1(val1) }

【讨论】:

    【解决方案3】:

    由于您在 ES6 代码版本中使用速记粗箭头函数,因此您无需指定 return 语句,因为它在此场景下隐含。

    所以在转换为使用正则函数时,那么这次你必须指定return语句。

    f0(value)
        .then(function(val1){ return f1(val1) })
        .then(function(val2){ return f2(val2) })
        .catch(function(error){ return result.textContent = error })
        .then(function(){ return final.textContent = "Done" });

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-16
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 2018-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多