2014-11-15 2 views
0

у меня есть ряд API конечных точек, которые мне нужно опрашивать в серии, чтобы создать канонический список:как управлять серией вызовов API в node.js

/cities 
/homes 
/parcelvalue 

так, что опрос /cities дает мне список городов, опрос /homes дает мне список всех адресов в данном городе, а опрос /parcelvalue дает мне значение данного дома.

В конце концов, я собираюсь создать файл дерева, сохраняющего инкрементный вывод опроса каждой конечной точки в каталог для целей аудита:

| 
\-cities/cities.json 
| 
\-homes/homes.json 
| 
\-parcelvalue/parcelvalue.json 

так что cities.json является сырым выход /cities enpoint, homes.json содержит результаты опроса конечной точки /homes для каждого города в cities.json, а parcelvalue.json содержит результаты опроса конечной точки /parcelvalue для каждого дома в homes.json. Я хочу, чтобы каждый шаг полагался на дисковый ввод-вывод, так что функция, которая строит homes.json, начинается с файла cities.json.

Самый простой способ, которым я могу это сделать, - сделать каждый шаг 1. синхронно загрузить файл, который мог бы его проинформировать, 2. синхронно опросить соответствующую конечную точку, а затем 3. синхронно сохранять файл, который каждый функция может генерировать:

getCities() функция может проверить, если cities.json существует, и производить файл из конечной точки, если это не так, getHomes() функция может импортировать cities.json, а затем опрашивать /homes конечную точку для каждого города в списке и затем сгенерируйте homes.json, а функция getParcelValues() может импортировать homes.json, а затем опросить конечную точку /parcelvalue r каждый дом в своем списке, а затем сгенерируйте parcelvalue.json

(это упрощение, я хотел бы добавить фильтрацию по функциям и обработку ошибок и т. д., но я стараюсь, чтобы этот пример был сфокусирован.)

К сожалению, тщательное изучение синхронных библиотек запросов HTTP в этот вечер не привело к тому, что будет работать в моих обстоятельствах.

Есть ли хороший способ использовать что-то вроде async.series или другую подобную библиотеку рабочего процесса async, чтобы использовать, т. Е. Библиотеку async request? Я хотел бы, чтобы каждая из этих функций вызывалась в серии, getCities() ->getHomes() ->getParcelValues(), и должна быть инкапсулирована настолько, насколько это возможно.

ответ

0

попробовать что-то вроде этого:

вар = требуют асинхронных ('асинхр');

async.auto({ 
     cities : function(cb) { 
    //do your stuff ... 
      if (err) 
       cb(null, false); 
      else 
       cb(null, result); 
     }, 
     homes : ['cities', function(cb, result) { 
      if(!result.cities) 
       cb(null, false) 
      else { 
       // do your stuff 
       if (err) 
        cb(null, false); 
       else 
        cb(null, homeResult); 
      } 
     }], 
     parcels : ['homes', function(cb, result) { 
      if(!result.homes) 
       cb(null, false) 
      else { 
       // do your stuff 
       if (err) 
        cb(null, false); 
       else 
        cb(null, parcelResult); 
      } 
     }] 
    },function(err, allResults){ 
     //do final works 
    }); 
Смежные вопросы