1
在下面的代碼中,我想要get
a Grid
,請求x
和y
。然後我再次get
Grid
。用戶輸入異步Node.JS
然而,由於Node.js的是異步的,,第二get
被要求x
後,給出x
之前執行和y
前問道。
我應該在執行其餘代碼之前檢查先前的過程是否已經完成。就我所知,這通常是通過回調完成的。我目前的回調似乎不足,在這種情況下我如何強制同步執行?
我試圖保持它的MCVE,但我不想留下任何重要的任一。
"use strict";
function Grid(x, y) {
var iRow, iColumn, rRow;
this.cells = [];
for(iRow = 0 ; iRow < x ; iRow++) {
rRow = [];
for(iColumn = 0 ; iColumn < y ; iColumn++) {
rRow.push(" ");
}
this.cells.push(rRow);
}
}
Grid.prototype.mark = function(x, y) {
this.cells[x][y] = "M";
};
Grid.prototype.get = function() {
console.log(this.cells);
console.log('\n');
}
Grid.prototype.ask = function(question, format, callback) {
var stdin = process.stdin, stdout = process.stdout;
stdin.resume();
stdout.write(question + ": ");
stdin.once('data', function(data) {
data = data.toString().trim();
if (format.test(data)) {
callback(data);
} else {
stdout.write("Invalid");
ask(question, format, callback);
}
});
}
var target = new Grid(5,5);
target.get();
target.ask("X", /.+/, function(x){
target.ask("Y", /.+/, function(y){
target.mark(x,y);
process.exit();
});
});
target.get();
你不能強迫同步執行。儘管(儘管仍然是異步的),你可以順序執行。只需在第二個'target.ask(...)'調用之前移動第二個'target.get()'調用 - 在第一個回調中。 – Bergi
@Bergi現在第二個'target.get()'將在'x'被放入之後執行,但仍然在'y'被提問之前執行。它比它更好,但是在執行第二個'target.get()'之前需要'y'。 – Mast
哦,對,我沒有真正得到你想要的。看起來你想把它放在'target.mark(x,y)'之後。 – Bergi