2014-09-13 3 views
2

사용자 입력을 얻기 위해 블로그에서 여러 가지 기법을 시도했지만 예제는 항상 사용자 입력을 요구하는 프로그램의 컨텍스트에서 수행되었다는 것을 언급하고 싶습니다. 그들은 항상 작동하지만 노드가 없기 때문에 node.js가 다음 코드 행에 계속해서 어떤 문제도 발생하지 않습니다.node.js에서 사용자 입력 대기

내가 사용자 입력을 가져온 다음 입력이 나는이 구조 생성하므로 유효한지 확인해야합니다 :

while (designAppealTest(subject) == false) { 
      subject[DESIGN_APPEAL] = ei.errorInput('designAppeal for the subject', iteration, subject[DESIGN_APPEAL]) 
     } 

가 호출하는 기능은 이것이다 :이 것을 제외하고 작동

module.exports.errorInput = function (fieldName, iteration, originalValue) { 
    originalValue = originalValue || 'false' 
    console.log('\n\n' + fieldName + ' for the subject' + ' contains an invalid value in for #' + i) 

    if (originalValue !== false) 
     console.log('original value of field = ' + originalValue) 

    console.log('\nPlease enter a new value for it:\n') 

    process.stdin.on('data', function (text) { 
     console.log('received data:', text); 
     return text; 
    }); 

} 

사용자가 값을 입력 할 수 있기 전에 while 루프를 계속 진행합니다. 그래서 내가 보는 것은 사용자가 초당 40,000 번 값을 입력하도록 요청하는 것입니다. 루프를 계속하기 전에 값을 입력 할 때까지 node.js를 대기 상태로 만들 수 있습니까? 구조체 자체가 잘못 되었습니까, 아니면 비동기식으로 정지하지 않았기 때문입니까?

CFrei는 :

좋아 나뿐만 아니라 자체 check()에 콜백을 추가 :

checkedSubject = check(subject, function(v) { 
      return v; 
     }); 

     console.log('checkedSubject = ' + checkedSubject) 

     function check(listing, callback) { 
      if (designAppealTest(subject) == false) { 
       ei.errorInput('designAppeal', iteration, listing[DESIGN_APPEAL], function(v) { 
        listing[DESIGN_APPEAL] = v; 
        check(listing) 
        }); 
      } else { 
       callback(listing); 
      } 
     } 

을 난 여전히 같은 문제가 받고 있어요 - 그것은 입력을 요구하지만 바로 뒤에 모두를 실행합니다.

+0

살펴 보셔야합니다 터미널로부터의 사용자 입력을 처리하기위한 npm의 기존 모듈. 예로는 [inquirer] (https://github.com/SBoudrias/Inquirer.js)와 [prompt] (https://github.com/flatiron/prompt)가 있습니다. – mscdex

+0

그냥 "프롬프트"모듈을 시도했지만 같은 문제가 발생했습니다 .. 사용자 입력을 기다리지 않고 있습니다 ... 요청할 것입니다. 그러나 바로 다음에 오는 행을 실행하여 아무 것도 입력 할 시간이 없습니다. –

답변

0

음, 비동기 접근법은 반환 값으로 "돌아 오지 않을 것"에 관한 것이고, 다음 콜백을 함수에 주면됩니다. 귀하의 "루프"처럼 보일 것입니다 :

function check() { 
    if (designAppealTest(subject) == false) { 
      ei.errorInput('designAppeal for the subject', iteration, subject[DESIGN_APPEAL], function(v) { subject[DESIGN_APPEAL] = v; check() }) 
    } 
} 

(당신의 "동안"시뮬레이션 재귀 호출을 유의하시기 바랍니다.)

그리고 대신

return text; 

을 그 함수를 호출 (수 있습니다 , async 또는 프로 같은 libs와

cb(text) 

을 그리고 예 :) 그것을 cb 이름 mise-Library는 좀 더 멋지게 보이도록 도와줍니다. 이 질문은 조금 오래된,하지만 난 여전히 얻을 생각 때문에

+0

나는 내 의견을 귀하의 제안을 시도하여 편집 .. 어쩌면 당신이 그것을 체크 아웃하고 내가 그 지점을 놓친 경우 알려주 수 있습니까? –

+0

가까이오고 있습니다. ;) 그래서 다른 콜백을 check-function에 추가하고 "else"-tree에서 호출합니다. 실제로 모든 함수는'function (value, ..., cb)'처럼 보일 것입니다. 그리고 지금 "return"처럼 함수의 "끝"에서이'cb '를 호출하는 습관이 생깁니다. – CFrei

+0

OP를 다시 업데이트했습니다 ... 귀하가 적절하게 말한 것을 구현했다고 생각합니다. 그러나 동일한 문제가 발생합니다. –

0

이는 node.js가 작동하는 방식으로, 높은 동시성을 위해 비동기식 비 차단 I/O를 중심으로 설계되었습니다. node.js의 작동 방식으로 인해 제어 흐름을 구성하는 데 도움이 필요하면 async과 같은 모듈을 사용할 수 있습니다.

+0

그래서 사용자 입력을 기다리는 비동기식 방법은 무엇입니까? 어쩌면 node.js의 기능에 대해 완전히 잘못 접근하고있는 것일까 요? 나는 상대적으로 프로그래밍에 익숙하지 않으므로 이에 대한 도움을 받으실 수 있습니다. –

3

구글에서 트래픽이 많이있다 : 당신은 일을 쉽게하기 위해, 당신은을 사용으로 보일 수 있습니다 nodejs readline

const readline = require('readline'); 

const rl = readline.createInterface({ 
    input: process.stdin, 
    output: process.stdout 
}); 

rl.question('What do you think of Node.js? ', (answer) => { 
    // TODO: Log the answer in a database 
    console.log(`Thank you for your valuable feedback: ${answer}`); 

    rl.close(); 
});