2014-11-19 2 views
0

내 코드는 학교 데이터베이스에서 내 보낸 다섯 개의 파일을 다운로드 한 다음 첫 번째 내보내기를 기반으로 쿼리를 실행합니다 (다른 네 개의 파일에 대한 쿼리가 있으며 세 개의 학교가 있으므로 내 기능을 확장해야합니다) .함수는 여전히 비동기 적으로 호출됩니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

"다운로드"라는 기능과 "updateSchedule"이라는 기능이 있습니다. 이 두 기능은 별도로 작동합니다.

var download = function(file){ 
 
    var deferred = q.defer(); 
 
    var i = 1; 
 
    var ftpGet = function(){ 
 
     var number = i++; 
 
     toString(number); 
 
     filename = file+number+'.csv'; 
 
     ftp.get(filename, filename, function(hadErr){ 
 
      if (hadErr){ 
 
       console.error('There was an error retrieving ' + filename); 
 
      }else{ 
 
       console.log(filename + ' downloaded'); 
 
       if(i <= 5){ 
 
        ftpGet(); 
 
       }else{ 
 
        deferred.resolve(); 
 
       } 
 
      } 
 
     }); 
 
    } 
 
    ftpGet(); 
 
    return deferred.promise; 
 
} 
 

 
var updateSchedule = function(school, school_id){ 
 
    var deferred = q.defer(); 
 
    console.log(''); 
 
    connectionpool.getConnection(function(err, connection){ 
 
     if(err){ 
 
      console.error('CONNECTION error: ', err); 
 
     }else{ 
 
      connection.query('DELETE FROM schedule WHERE school_id = "'+school_id+'"', function(err, rows){ 
 
       if (err) console.error(err); 
 
       var path = './'+school+'_export1.csv'; 
 
       var reader = csv.createCsvFileReader(path, {'separator': ',','quote': '"','excape': '"','comment': ''}); 
 
       reader.addListener('data',function(data){ 
 
        connection.query('INSERT INTO schedule SET section_id = "'+data[0]+'", student_id = "'+data[1]+'", course_number = "'+data[2]+'", period = "'+data[3]+'", teacher_id = "'+data[4]+'", school_id = "'+school_id+'"', function(err, rows){ 
 
         if (err) console.error(err); 
 
         deferred.resolve(); 
 
        }); 
 
       }); 
 
      }); 
 
      connection.release(); 
 
      console.log(school+' schedule updating...'); 
 
     } 
 
    }); 
 
    return deferred.promise; 
 
}

내가 약속을 사용하여 전화

그러나, 나는 그것이 파일을 열 수 없다는 오류가 발생합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

오류 메시지를 게시하십시오. – Shaun

+0

시작하려면'filename'을 암시적인 전역이 아닌 지역 변수로 만드십시오. 그런 다음 아무 것도하지 않거나 오류를 일으키고 다른 문자열에 추가 될 때 숫자가 자동으로 문자열로 변환되기 때문에 어쨌든 필요하지 않으므로'toString (number)'를 제거하십시오. – jfriend00

+0

은'ftpGet()'선언을'download()'와 분리하여'ftpGet (fileName)'이 하나의 파일 만 잡고 가져올 수 있도록합니다. 'download()'는 여러 개의'ftpGet()'호출을하고 이에 따라 정보를 처리합니다. – theoperatore

답변

1

변경

download('lca_export').then(updateSchedule('lca', '517'));
이이에

download('lca_export').then(updateSchedule('lca', '517')); 

: 즉시 updateSchedule()를 호출하고 .then()에 결과를 전달보다는 기능 REFE를 통과했다

download('lca_export').then(function() { 
    updateSchedule('lca', '517'); 
}); 

나중에 호출 할 수있는 .then()에 있습니다. 따라서 download()이 작업을 수행하기 전에 updateSchedule()이 실행 중이었습니다. 이것은 매우 흔한 실수입니다. 함수 이름 다음에 괄호가 있으면 즉시 실행된다는 것을 기억하십시오. 함수 이름이거나 괄호가없는 익명 선언 일 경우 함수 참조를 전달하는 것입니다. 정리에


몇 가지 다른 것들 :

  1. filename 앞에 var 추가는 지역 변수가 아니라 암시 글로벌 이상의 확인합니다.
  2. toString(number)을 삭제하십시오. 기껏해야 그것은 전혀 필요하지 않으며 아무 것도 결과를 지정하지 않으므로 아무 것도하지 않습니다. 최악의 경우 기능이 없기 때문에 오류가 발생합니다 toString(). 참고로 숫자는 문자열에 추가 될 때 자동으로 문자열로 변환되므로 수동으로 입력 할 필요가 없습니다.
+0

굉장! 정말 고맙습니다! 네, 확실히 toString()을 잘못 사용하고 있습니다 ... 다소 놀랍지 만 지금은 생각했습니다. 어쨌든 다시 고마워! – user3630824

관련 문제