Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 管道数据一次读取';在Node.js中准备好了吗_Javascript_Node.js_Pipe_Geocoding_Jsonstream - Fatal编程技术网

Javascript 管道数据一次读取';在Node.js中准备好了吗

Javascript 管道数据一次读取';在Node.js中准备好了吗,javascript,node.js,pipe,geocoding,jsonstream,Javascript,Node.js,Pipe,Geocoding,Jsonstream,我有一个大的JSON文件,如下所示: [ { "id": 2000, "city": "New York", "lat": "", "lon": "", }, ... ] 我在寻找每个物体的纬度和经度。我正在使用JSONStream模块来传输数据: var writeStream = fs.createWriteStream('data/stream.json'); var readStream = fs.createReadStream('data/dummy/insti

我有一个大的JSON文件,如下所示:

[
 {
  "id": 2000,
  "city": "New York",
  "lat": "",
  "lon": "",
 },
...
]
我在寻找每个物体的纬度和经度。我正在使用JSONStream模块来传输数据:

var writeStream = fs.createWriteStream('data/stream.json');
var readStream = fs.createReadStream('data/dummy/institucion_1_2000.json', {encoding: 'utf8'})

// Search for lat and lon
var search = es.mapSync(function(data){
  if(data.lat == ""){
    // Search for the lat and lon
    geocoder.geocode({address: data.city, country: "US"}) 
      .then(function(res) {
        console.log("Searched for " + res[0].formattedAddress);
        data.lat = res[0].latitude;
        data.lon = res[0].longitude;
      })
      .catch(function(err) {
        console.log("There was an error with element with id = " + data.id);
        console.log("Here is the error: " + err);
        if(err == 'Error: Status is OVER_QUERY_LIMIT. You have exceeded your rate-limit for this API.') {
          process.exit();
        }
      });
    return data;
  }
})

// Pipe
readStream
  .pipe(JSONStream.parse('*'))
  .pipe(search) 
  .pipe(JSONStream.stringify()) // This doesent wait until the search is finish
  .pipe(writeStream)
地理编码部分工作正常

我的问题是,JSONStream.stringify在搜索函数结束之前读取并通过管道传输数据。所以我得到的是相同的JSON文件,没有需要的修改。如果我尝试一下:

if(data.lat == ""){
    lat = 1;
}
与需要更多时间的地理编码不同,它是有效的。我猜我的问题在于修改数据流所需的时间。那么,有没有一种方法可以在数据被修改后对其进行管道化处理

编辑 我在同步和异步之间搞得一团糟。多亏了


您正在使用mapSync,但在其中执行异步操作?我尝试使用map(),但结果相同。有什么想法吗?你在.then()中调用回调了吗?是的!真管用!谢谢!
var search = es.map(function (data, callback) {
  if(data.lat == ""){
    geocoder.geocode({address: data.city, country: "USA"}) // Choose between Comuna_Empresa and Comuna_Institucion
    .then(function(res) {
      console.log("Searched for " + res[0].formattedAddress);
      data.lat = res[0].latitude;
      data.lon = res[0].longitude;
      callback(null,data);
    })
    .catch(function(err) {
      console.log("There was an error with element at index = " + index);
      console.log("Here is the error: " + err);
    });
  }
})