2016-02-10 8 views
1

Это результат от TheMovieDatabaseсинхронного вызов и присоединяемые органы приводят с асинхронным

"results": [ 
    { 
     "poster_path": "/k1QUCjNAkfRpWfm1dVJGUmVHzGv.jpg", 
     "adult": false, 
     "overview": "Based upon Marvel Comics’ most unconventional anti-hero, DEADPOOL tells the origin story of former Special Forces operative turned mercenary Wade Wilson, who after being subjected to a rogue experiment that leaves him with accelerated healing powers, adopts the alter ego Deadpool. Armed with his new abilities and a dark, twisted sense of humor, Deadpool hunts down the man who nearly destroyed his life.", 
     "release_date": "2016-02-09", 
     "genre_ids": [ 
     35, 
     12, 
     28, 
     878 
     ], 
     "id": 293660, 
     "original_title": "Deadpool", 
     "original_language": "en", 
     "title": "Deadpool", 
     "backdrop_path": "/n1y094tVDFATSzkTnFxoGZ1qNsG.jpg", 
     "popularity": 43.515295, 
     "vote_count": 192, 
     "video": false, 
     "vote_average": 5.46 
    }] 

мне нужно сделать вызов к Itunes апите тоже, используя ORIGINAL_TITLE и объединить свойства каждого объекта массива. Если я столкнулся с именем свойства, я не против.

Это выглядит примерно так, что на данный момент:

request({ 
     uri: url, 
     method: 'GET' 
    }, 
    function (error, response, body) { 
     // The movie Database results 
     previousBody = JSON.parse(body); 

     if (!error && response.statusCode === 200) { 
      resultBody = JSON.parse(body); 
      async.each(resultBody.results, function (element, callback) { 
       // ITunes api call 
       request({ 
        uri: searchEndPoint + qs.stringify({ 
         term: element.original_title, 
         media: 'movie', 
         entity: 'movie', 
         limit: 1 
        }), 
        method: 'GET' 
       }, function (error, response, body) { 
        if (!error && response.statusCode === 200) { 
         // I want to append to the results of item in 'element' and send it back in the res 

         res.write(JSON.stringify(_.extend(element, JSON.parse(body)))); 
        } else { 
         errorCallback(res, error, response, body); 
        } 
       }); 
       callback() 
      }); 

     } else { 
      errorCallback(res, error, response, body); 
     } 
    } 
); 

Я хочу, чтобы отправить обратно результат, когда сделано со всем ITunes результатов были синтаксическими и добавлены в ответ.

Edit: новый код:

 var fullResults = []; 
    request({ 
      uri: url, 
      method: 'GET' 
     }, 
     function (error, response, body) { 
      if (!error && response.statusCode === 200) { 
       var resultBody = JSON.parse(body); 
       async.map(resultBody.results, function (element, callback) { 
         request({ 
          uri: searchEndPoint + qs.stringify({ 
           term: element.original_title, 
           media: 'movie', 
           entity: 'movie', 
           limit: 1 
          }), 
          method: 'GET' 
         }, function (error, response, body) { 
          if (!error && response.statusCode === 200) { 
           fullResults.push(JSON.stringify(_.extend(element, JSON.parse(body)))); 
           callback(); 
          } else { 
           errorCallback(res, error, response, body); 
          } 
         }); 
        }, 
        function (err) { 
         if (err) { 
          errorCallback(res, err, response, body); 
         } else { 
          resultBody.results = fullResults; 
          res.status(200).send(resultBody); 
         } 
        }); 

      } else { 
       errorCallback(res, error, response, body); 
      } 
     }); 
} 
+0

Вы не можете продолжать писать JSON вашего ответ, как это. Существуют также синтаксические ошибки, и вы, скорее всего, захотите использовать функцию карты. – tsturzl

+0

callback() следует вызывать внутри обратного вызова запроса и использовать карту вместо каждого –

+0

При просмотре документации async я пропустил что-то 3-й параметр, поэтому я добавил его, и он решил мою проблему, и я исправил переписывание моего json другим Кстати, могу ли я отправить и ответить на мой вопрос? –

ответ

-1

Попробуйте это. я использовал асинхронный карты функции

request({ 
      uri: url, 
      method: 'GET' 
     }, 
     function(error, response, body) { 
      // The movie Database results 
      previousBody = JSON.parse(body); 

      if (!error && response.statusCode === 200) { 
       resultBody = JSON.parse(body); 
       async.map(resultBody.results.map(function(element) { 
         return function(callback) { 
          // ITunes api call 
          request({ 
           uri: searchEndPoint + qs.stringify({ 
            term: element.original_title, 
            media: 'movie', 
            entity: 'movie', 
            limit: 1 
           }), 
           method: 'GET' 
          }, function(error, response, body) { 
           if (!error && response.statusCode === 200) { 
            // I want to append to the results of item in 'element' and send it back in the res 

            res.write(JSON.stringify(_.extend(element, JSON.parse(body)))); 
            return callback({ 
             error: error, 
             body: body, 
             response: response 
            }); 
           } else { 
            return callback(); 
           } 
          }); 

         } 
        }, function(err) { 
         return errorCallback(err.error, err.response, err.body); 
        }); 

       } else { 
        return errorCallback(res, error, response, body); 
       } 
      }) 
+0

Это не будет работать на 100% из-за '' 'res.write (JSON.stringify (_. Extend (element, JSON.parse (body)))) ; '' ' –

+0

Я добавил свой рабочий код, но мы, вероятно, можем сделать его лучше –