如何让_.each在$ .when done handler中处理'array'和'array of array'

时间:2016-10-04 03:33:21

标签: jquery coffeescript underscore.js

我必须执行一些json调用并对结果应用回调。在运行时之前,调用次数是未知的。因此,我使用$.when.apply将一组承诺传递给when

  jsonPromises     = []
  newContentActions = []
  for model in models
      jsonPromises.push contentCreator.create(model)
      action = new ActionHandler model
      newContentActions.push action

  $.when.apply($, jsonPromises)
  .then (args...) =>
    _.each args, (result, idx) =>
      return unless result[1] is 'success'
      action = newContentActions[idx]
      action result[0]

它或多或少地按预期工作。当有超过1个承诺时,then的{​​{1}}处理程序将获得一个数组数组(例如。$.when,如Chrome开发者控制台中所示)。然后,[[Object, "success", Object], [Object, "success", Object]]可以将其正确解压缩到_.each

但是如果只有1个promise,我只会在result, idx处理程序中获得一个数组。它让then感到困惑。 _.each解压缩单个数组并产生3个函数调用。我的应用程序失败了。

为了解决这个问题,我会额外检查承诺的数量。如果只有一个,我将不会使用each

$.when

这是实现这一结果的唯一方法吗?有没有办法删除 if jsonPromises.length is 1 jsonPromises[0].done (model) => action = newContentActions[0] action model else $.when.apply($, jsonPromises) .then (args...) => _.each args, (result, idx) => return unless result[1] is 'success' action = newContentActions[idx] action result[0] 检查?

1 个答案:

答案 0 :(得分:0)

如果您发现jsonPromises.length是1

,我的解决方案是将args包装在一个数组中
  $.when.apply($, jsonPromises)
  .then (args...) =>
    args = [args] if jsonPromises.length is 1
    _.each args, (result, idx) =>
    return unless result[1] is 'success'
    action = newContentActions[idx]
    action result[0]