Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.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_Coffeescript_Promise - Fatal编程技术网

Javascript 咖啡脚本中的可选承诺

Javascript 咖啡脚本中的可选承诺,javascript,coffeescript,promise,Javascript,Coffeescript,Promise,我正在构建一个节点树,但当我遇到某个值时,我需要发出一个rest请求来获取子节点,然后再构建它们。当我为connector.get请求硬编码了值时,下面的方法有效,但当我将其转换为承诺时,函数会在承诺返回之前返回。我如何重构它以延迟返回,直到所有承诺都得到解决 buildDom: (viewObj) -> treeElm = document.createElement('div') rowContainer = document.createElement('ul')

我正在构建一个节点树,但当我遇到某个值时,我需要发出一个rest请求来获取子节点,然后再构建它们。当我为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
cellElm会随着循环的每次迭代而更改,因此可能会在connector.get运行期间更改,这将导致附加到错误的元素。这就是你看到的吗?修复方法是将cellElm传递给函数,这样就有了connector.get调用可以使用的存储副本。我在下面内联了这样一个函数

      if !cell.view?
        ((element) ->
          connector.get(cell.view).then (res)->
            element.appendChild buildDom(res))(cellElm)
在承诺异步解决之前,始终必须同步返回。你唯一的选择就是回报承诺。