我无法让ES6承诺工作

时间:2017-09-12 04:35:21

标签: javascript node.js es6-promise

我无法理解承诺是如何运作的。所以我想我会跳进去尝试创建一个看看是否有帮助。但是以下内容返回一个未定义的值(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循环。

3 个答案:

答案 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)
        }
    });
}
希望它对你有用。