【问题标题】:What does the exception "ArgumentError: a promise has already been chained" mean, and how do I debug it?异常“ArgumentError: a promise has been chained”是什么意思,我该如何调试它?
【发布时间】:2015-06-16 20:49:55
【问题描述】:

我现在和 Volt 一起工作有点疯狂。当我尝试做一些更复杂的事情时,我最终在浏览器控制台中收到异常“ArgumentError: a promise has been chained”。

堆栈跟踪没有指向任何我认为有用的东西。

这个错误的真正含义是什么,我该如何去寻找原因?

我会发布一些代码,但其中一些错误会出现在页面加载时,并没有指出问题出在哪里,所以我需要发布整个应用程序:/

【问题讨论】:

    标签: voltrb


    【解决方案1】:

    Volt 使用 Opal 的 promise 实现,我相信它基于 JS 领域的 A+ 规范。您看到的错误是因为承诺只能有一个 .then 或 .fail 块。每个 .then 或 .fail 都会返回一个新的 Promise,然后您可以将其链接起来。

    所以你可以这样做:

    promise = Promise.new
    promise2 = promise.then do
      ..
    end
    promise2.then do
      ..
    end
    

    (请注意,我正在分配 promise2 而不是再次链接第一个)

    但你不能这样做:

    promise = Promise.new
    promise.then do
      ...
    end
    
    promise.then do
      ..
    end
    

    (注意我是如何多次调用 .then 的)

    写第一个的更紧凑的方法是链接结尾

    promise = Promise.new
    
    promise.then do
      ..
    end.then do
      ..
    end.fail do
      ..
    end
    

    Volt 绑定需要一个没有被链接的承诺。另外,我认为我可以让它在你可以多次链接的地方工作,尽管我没有考虑到这一切的含义,所以我可能是错的。如果我有时间,我可能会编写一个新的 Promise 实现来处理这个问题。如果您仍然看到该错误并且以上内容无法解释其原因,请告诉我。谢谢!

    【讨论】:

    • 感谢 Ryan,这很有意义。来自 Rails,而不是前端开发,我认为 Promise 的东西是让我在学习 Volt 时最困惑的原因。这个解释很有帮助。
    猜你喜欢
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 2023-03-28
    相关资源
    最近更新 更多