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