2014-09-13 94 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循環。所以我看到的是提示要求用戶輸入每秒40000次的值。在繼續循環之前,如何讓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)和[提示](https://github.com/flatiron/prompt)。 – mscdex 2014-09-13 17:26:42

+0

我只是嘗試了「提示」模塊,但我遇到了同樣的問題..它不會等待用戶輸入...它會詢問它,但立即執行下一行,因此沒有時間輸入任何內容。 – 2014-09-13 19:15:55

回答

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; 

你調用該函數(讓它命名爲cb):

cb(text) 

是的,像async或Pro庫mise-Library有助於使它看起來更美觀。

+0

我編輯了我的帖子嘗試了你的建議..也許你可以檢查出來,讓我知道如果我錯過了這一點? – 2014-09-13 22:02:23

+0

你越來越近了。 ;)因此,添加另一個回調到檢查函數,並在「其他」樹中調用。真的,你所有的函數應該看起來像'function(value,...,cb)',你習慣於在函數的「末尾」調用這些'cb',就像你現在「返回」一樣。 – CFrei 2014-09-13 22:17:41

+0

再次更新OP ...我認爲我實現了你所說的正確..但是我得到同樣的問題。 – 2014-09-13 22:39:47

0

這就是node.js的工作方式,它圍繞異步,非阻塞I/O設計,以實現高併發性。如果由於node.js的工作原因需要組織控制流程的幫助,則可以使用模塊(例如async)進行研究。

+0

那麼完成等待用戶輸入的異步方式是什麼?也許我完全接近node.js的能力這個錯誤?我對編程相對比較陌生,所以對此有任何幫助將不勝感激。 – 2014-09-13 21:00:55

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(); 
});