Мне нужно выполнить несколько вызовов 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]
Работает, как ожидалось, более или менее. Если существует более одного обещания, обработчик then
$.when
получит массив массивов (например, [[Object, "success", Object], [Object, "success", Object]]
, как показано в консоли Chrome dev). _.each
можно правильно распаковать в result, idx
.
Однако, если есть только 1 обещание, я получаю только один массив в обработчике then
. Он смущает _.each
. each
распаковывает единственный массив и приводит к 3 вызовам функций. И мое приложение не работает.
Чтобы обойти это, я делаю дополнительную проверку количества обещаний. Когда есть только один я не буду использовать $.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]
Это единственный способ достичь этого результата? Есть ли способ удалить jsonPromises.length is 1
?