2016-10-24 3 views
0

저는 Node.js를 처음 접했고 그 수명에 따라 전체 콜백 비동기 문제를 파악할 수 없습니다.nodejs의 배열에 비동기 결과 추가

내가 원하는 것은 "비교적"간단하다. 모든 호출을 차단하면된다.

1) 목록

2) 새로운 요소와의 새로운리스트를 새로운 요소를 생성

3) 요소를 반복 요청 속성 다른 요청

4) 신규 추가의 결과 인 새 목록에 요소

세부 사항 :

var originalList = [{ 
    provider: "ABC", 
    loc: [13.37224, 52.53862], 
    state: 22 
}, { 
    provider: "CDE", 
    loc: [13.37124, 52.53262], 
    state: 33 
}, { 
    provider: "EFG", 
    loc: [13.37214, 52.53662], 
    state: 44 
}]; 

var newElement; 
var newList = []; 
var vLat, vLng; 

originalList.forEach(function(element, index, array) { 

    newElement = { 
     provider: element.provider, 
     state: element.state 
    }; 
    vLat = element.loc[1]; 
    vLng = element.loc[0]; 

    async.parallel([ 
     function(callback) { 
      var location; 
      googleMapsClient.reverseGeocode({ 
       latlng: [vLat, vLng], 
       result_type: ['street_address'], 
       location_type: ['ROOFTOP', 'APPROXIMATE'] 
      }, function(err, response) { 
       if (!err) { 
        var result = response.json.results; 
        location = result[0].formatted_address; 
        newElement.location = location; 
        callback(); 
       } else { 
        callback(err); 
       } 
      }); 
     } 
    ], function(err) { 
     if (err) console.log(err); 
     newList.push(newElement); 
    }); 
}); 

Google Maps 요청을하는 두 번째 비동기 함수를 생략하고 그 결과를 newElement에도 추가해야합니다.

저는 newElement가 새로운 속성 (newElement.location)을 얻지 못하는 이유를 정말로 고민하고 있습니다. 나는 그것이 기본이 될 것을 안다.

+0

해야합니다 같은 코드가 있어야한다고 생각합니다 여기에 여분의'}'배열의 모든 객체 뒤에 – brk

+0

당신은 originalList 배열을 의미합니까? 그냥 이상한 서식을 – Rafael

+1

'async.map()'을 사용하고 당신은 iterator에서 최종 콜백에 물건을 전달할 수 있습니다 – Plato

답변

1

루프는 모든 항목 처리의 흐름을 제어하는데도 비동기 적이어야합니다. async.each() 또는 async.eachSeries를 (사용) (다른 후 하나의 목록을 처리) :

var originalList = [{ 
    provider: "ABC", 
    loc: [13.37224, 52.53862], 
    state: 22 
}, { 
    provider: "CDE", 
    loc: [13.37124, 52.53262], 
    state: 33 
}, { 
    provider: "EFG", 
    loc: [13.37214, 52.53662], 
    state: 44 
}]; 

var newList = []; 

async.each(originalList, function (element, eachCb) { 

    var newElement = { 
     provider: element.provider, 
     state: element.state 
    }; 
    var vLat = element.loc[1]; 
    var vLng = element.loc[0]; 

    async.parallel([ 
     function(callback) { 
      var location; 
      googleMapsClient.reverseGeocode({ 
       latlng: [vLat, vLng], 
       result_type: ['street_address'], 
       location_type: ['ROOFTOP', 'APPROXIMATE'] 
      }, function(err, response) { 
       if (!err) { 
        var result = response.json.results; 
        location = result[0].formatted_address; 
        newElement.location = location; 
        callback(); 
       } else { 
        callback(err); 
       } 
      }); 
     } 
    ], function(err) { 
     if (err) { 
      console.log(err); 
     } else { 
      newList.push(newElement); 
     } 
     eachCb(); // <<<<< call to signal it's done!! 
    }); 
}, function (err) { 
    console.log('finish processing all items in originalList'); 
}); 

만 1 일이 있다면, 당신은 async.parallel()

0

필요하지 않습니다 나는 async.parallel의 API 문서에 따라

var originalList = [{ 
    provider: "ABC", 
    loc: [13.37224, 52.53862], 
    state: 22 
}, { 
    provider: "CDE", 
    loc: [13.37124, 52.53262], 
    state: 33 
}, { 
    provider: "EFG", 
    loc: [13.37214, 52.53662], 
    state: 44 
}]; 

var newElement; 
var newList = []; 
var vLat, vLng; 

originalList.forEach(function(element, index, array) { 

    newElement = { 
     provider: element.provider, 
     state: element.state 
    }; 
    vLat = element.loc[1]; 
    vLng = element.loc[0]; 

    async.parallel([ 
     function(callback) { 
      var location; 
      googleMapsClient.reverseGeocode({ 
       latlng: [vLat, vLng], 
       result_type: ['street_address'], 
       location_type: ['ROOFTOP', 'APPROXIMATE'] 
      }, function(err, response) { 
       if (!err) { 
        var result = response.json.results; 
        location = result[0].formatted_address; 
        newElement.location = location; 
        callback(null, 'success'); 
       } else { 
        callback(err); 
       } 
      }); 
     } 
    ], function(err, results) { 
     if (err) console.log(err); 
     newList.push(newElement); 
    }); 
}); 

아래 if (!err)callback()가`json으로 array`는, T 잘못된 것 같다 callback(err, results)