javascript - 在另一个 Promise 的 .then() 中测试一个 Promise

标签 javascript node.js promise mocha.js chai

我试图了解如何在另一个 Promise 中解决一个 Promise。
我希望实现的步骤如下:

  1. 通过 UserManager 获取一个 User (功能)
  2. 改变它的 firstName
  3. 通过 UserManagerUser 保存到数据库中(功能)

我正在寻找测试 UserManager.saveUser(user); 的响应,它在成功时返回 true。但是我遇到了一个错误。


UserManagerTest.js

//[...]

it("Should save a user to the database", function () {
    var response = UserManager.getUserByLogin("Foo.Bar@provider.com", "Test")
        .then(function (user) {
            user.firstName = "Macarena";
            return UserManager.saveUser(user);
        })
        .catch((error) => {
            console.log("This error occured: "+error);
            return false;
        })
    return Promise.all([
        expect(response).to.eventually.be.true
    ]);
});

//[...]

控制台输出

  1) UserManager Save Should save a user to the database:
     AssertionError: expected undefined to be true
      at node_modules/chai-as-promised/lib/chai-as-promised.js:305:22
      at process._tickCallback (internal/process/next_tick.js:109:7)

UserManager.js

static saveUser(user){
    return new Promise((resolve, reject) => {
        pool.getConnection((err, connection)=> {
            if(err) reject(err);

            connection.query("SHOW COLUMNS FROM User;", (error, results, fields) => {
                if(error) reject(error);

                var availableFields = {savable: [], primary: []};
                //[...]
                resolve(availableFields);
            });

            connection.release();
        });
    })
    .then((result) => {
        var usedFields = {savable: [], primary: []};
        //[...]
        return usedFields;
    })
    .then((result) => {
        var sqlParams = [];
        var sql = "UPDATE User SET";
        //[...]
        sql += ";";
        pool.getConnection((err, connection) => {
            if(err) throw err;

            connection.query(sql, sqlParams, (error, results, fields) => {
                if(error) throw error;
                connection.release();
                return results.affectedRows == 1;
            });
        });
    })
    .catch((error) => {
        console.log(error);
        throw error;
    })
};

最佳答案

第二个 then((result)=> ...) 不返回任何东西,因此 undefined

return results.affectedRows == 1; 在 lambda 中。它返回那个 lambda,而不是周围的 `then``

您需要更改 pool.getConnection 的语义,将其从回调更改为 Promise。将其包装在 Promise 中,解析并链接它,看起来像

return new Promise((resolve, reject) => {

    pool.getConnection((err, connection) => {
        if(err) {
             //see @robertklep comment
             try { connection.release(); } catch(e) { /* ignore ? */ }
             return reject(err);
        }

        connection.query(sql, sqlParams, (error, results, fields) => {
            if(error) throw error;
            connection.release();
            resolve(results.affectedRows == 1);
        });
    });
})

关于javascript - 在另一个 Promise 的 .then() 中测试一个 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42719050/

相关文章:

javascript - 将 HTML 动态添加到 iFrame 中 - Javascript

javascript - 如何按日期对对象进行分组?

ios - Cordova 和 IO 宽度问题

javascript - 如何根据函数参数推断 Promise 的返回类型?

javascript - 如何限制/控制过多的异步调用?

javascript - 如果没有特定的 key ,但应该是,如何处理错误

javascript - 如何清除处于 redux 状态的数组以进行多选

javascript - axios 调用从第一个 api 获取响应并传递到第二个 api

javascript - AngularJS ng-repeat 不从 Controller 获取数据

node.js - Npm 从 repo 安装未运行 `prepare`