2016-10-04 2 views
0

Мне нужно выполнить несколько вызовов 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?

ответ

0

Мое решение было бы просто обернуть арг в массиве, если вы видите, что jsonPromises.length является 1

$.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] 

 Смежные вопросы

  • Нет связанных вопросов^_^