我无法理解承诺是如何运作的。所以我想我会跳进去尝试创建一个看看是否有帮助。但是以下内容返回一个未定义的值(arrTables):
app.get("/getTables", function (req, res) {
var arrTables = getTables().then(function(response) {
console.log("getTables() resolved");
console.log(arrTables.length);
console.log(arrTables[1].ID());
}, function(error) {
console.error("getTables() finished with an error");
});
});
function getTables() {
return new Promise(function(resolve, reject) {
while (mLobby.tlbCount() < LOBBY_SIZE) {
var objTable = new Table();
mLobby.addTable(objTable);
}
resolve(mLobby.tables);
});
}
new Table()
引用了一个进行异步数据库调用的自定义类。我正在尝试使用promises来确保在继续执行代码之前调用已解决。谁能指出我出错的地方?
这是控制台输出:
getTables() resolved
undefined
(node:6580) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id:
1): TypeError: Cannot read property 'ID' of undefined
编辑添加:mLobby.tblCount从0开始,因此它确实进入了while循环。
答案 0 :(得分:3)
数组变量的问题。 GetTable方法不返回任何内容,此方法的输出存储在响应变量中,而不是arrTables
变量中。尝试使用response
变量而不是arrTables
getTables().then(function(response) {
var arrTables = response //Added
console.log("getTables() resolved");
console.log(arrTables.length);
console.log(arrTables[1].ID);
}, function(error) {
console.error("getTables() finished with an error");
});
答案 1 :(得分:3)
适应Promise的控制流程可能需要一些时间来适应。 你很亲密!但...
var arrTables = getTables().then(function(response) {
console.log("getTables() resolved");
console.log(arrTables.length); ...
是一个变量声明。
这类似于撰写var a = a
。您无法在arrTables声明中访问arrTables,因为它尚未声明!
您传递给.then()
的匿名函数(您错误地尝试访问undefined
变量arrTables时的属性)与您调用resolve(mLobby.tables)
的函数完全相同在你的承诺范围内。
您从getTables
承诺 返回的承诺将mLobby.tables()
作为response
传递给您的匿名函数。
我建议在尝试将它们用于更大的应用程序之前,先使用promises进行一些练习。
优秀的nodeschool.io研讨会promise-it-wont-hurt对我非常有帮助。
答案 2 :(得分:0)
您可以尝试使用以下代码。
app.get("/getTables", async function (req, res) {
var arrTables = await getTables()
console.log(arrTables.length);
console.log(arrTables[1].ID());
});
async function getTables() {
return new Promise(function(resolve, reject) {
try {
while (mLobby.tlbCount() < LOBBY_SIZE) {
var objTable = new Table();
mLobby.addTable(objTable);
}
resolve(mLobby.tables);
} catch (err) {
console.error("getTables() finished with an error");
reject(err)
}
});
}
希望它对你有用。