2015-11-12 2 views
1

Я работаю на API, через который я должен иметь возможность добавить список пользователей в JIRA наблюдателей (так я говорю с JIRA REST API)Node.js: ждать ответ от асинхронного вызова

Вот функция, чтобы сделать это:

for (var i = 0; i < votes.totalValue; i++) { 
     var voter = { 
      user : votes.rawVoteData[i].user, 
      value : votes.rawVoteData[i].value, 
      email : votes.rawVoteData[i].email, 
      fname : votes.rawVoteData[i].fname, 
      lname : votes.rawVoteData[i].fname 
     }; 

     // Add these users as watchers to the Jira 
     jira.jira.addWatcher(issueId, voter.user, function(err, result){ 
      // TODO: Return to callback 
      rep++; 
      console.log('user='+voter.user); 
      console.log(result); 

     }); 
    } 

объект голосов имеет список пользователей, указанный выше. Теперь проблема заключается в том, что когда я выполняю эту функцию, из-за асинхронности узла, цикл for выполняется полностью, тогда все асинхронные вызовы сразу запускаются. (что не работает для меня, так как JIRa REST API, похоже, не поддерживает это)

Я хочу изменить приведенный выше код, чтобы я сделал вызов функции addWatcher для пользователя по одному за раз & make следующий вызов addWAtcher для следующего пользователя, только если предыдущий асинхронный вызов вернулся (т. е. перейти к следующему асинхронному вызову один за другим для каждого пользователя, а не полностью отключить все вызовы в addwatcher).

я делаю это?

Просьба сообщить,

спасибо!

+0

«Не похоже, чтобы поддержать это». - Вы могли бы уточнить, вы получаете сообщение об ошибке или он просто не работает? –

+0

он просто не работает. В jira rest api есть конечная точка addwatcher, которая возвращает код состояния 204 при добавлении наблюдателя. Когда я использую вышеуказанный код, я получаю 204 для всех пользователей, но когда я иду на jira и проверить, добавлены ли пользователи, я вижу только последнего добавленного пользователя. – Rookie

ответ

1

вы должны взглянуть на модуль async.

Вы можете использовать функцию async.each(). Функция принимает массив элементов, затем выполняет итерацию по ним, вызывая функцию-оболочку, которая принимает этот элемент в качестве аргумента. Когда все вызовы завершены, вы указываете окончательную функцию, которая будет вызываться. другого решения может быть async.parallel() (в случае, если вы не возражаете, запуская их параллельно

Кредита для this большого учебника

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