【问题标题】:Optional Promise in CoffeescriptCoffeescript 中的可选承诺
【发布时间】:2015-12-10 21:04:10
【问题描述】:

我正在构建一个节点树,但是当我遇到某个值时,我需要发出一个休息请求来获取子节点,然后再构建这些节点。当我为connector.get 请求硬编码了值时,下面的工作有效,但是当我将它变成一个承诺时,函数在承诺返回之前返回。我该如何重构它以延迟返回,直到所有承诺都解决?

 buildDom: (viewObj) ->
    treeElm = document.createElement('div')
    rowContainer = document.createElement('ul')
    view = viewObj.data.options[0]
    i = 0
    while i < view.rows.length
      rowElm = document.createElement('li')
      rowElm.innerHTML = 'Row ' + i
      row = view.rows[i]
      cellContainer = document.createElement('ul')
      j = 0
      while j < row.cells.length
        cell = row.cells[j]
        cellElm = document.createElement('li')
        if cell.view
          cellElm.innerHTML = 'View: ' + cell.view
          if !cell.view?
            connector.get(cell.view).then (res)->
              cellElm.appendChild buildDom(res)
        else if cell.fieldId
          cellElm.innerHTML = 'Field: ' + cell.fieldId
        if cell.displayType != 'NONE'
          cellContainer.appendChild cellElm
        j++
      rowElm.appendChild cellContainer
      rowContainer.appendChild rowElm
      i++
    treeElm.appendChild rowContainer

【问题讨论】:

  • 你总是必须return(同步地)在承诺(异步地)解决之前。你唯一的选择是回报一个承诺。

标签: javascript coffeescript promise


【解决方案1】:

cellElm 会随着循环的每次迭代而变化,因此可能会在 connector.get 运行期间发生变化,这将导致附加到错误的元素。这就是你所看到的吗?解决方法是将cellElm 传递给一个函数,以便connector.get 调用可以使用它的存储副本。我在下面内联了这样一个函数。

      if !cell.view?
        ((element) ->
          connector.get(cell.view).then (res)->
            element.appendChild buildDom(res))(cellElm)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 2018-07-29
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    相关资源
    最近更新 更多