在另一个 Promise 的 .then() 中测试一个 Promise
Testing a Promise within another Promise's .then()
我正在尝试了解如何在另一个 Promise 中解决一个 Promise。
我希望实现的步骤如下:
- 通过
UserManager
(正在运行) 通过其 ID 获取 User
- 改变其
firstName
- 通过
UserManager
(功能) 将User
保存到数据库
我想测试 UserManager.saveUser(user);
的响应,其中 returns 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)=> ...)
没有 return 任何东西,因此 undefined
return results.affectedRows == 1;
在 lambda 中。它 return 在那个 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);
});
});
})
MySql 是异步的,不 return 承诺。
function queryDB(result) {
return new Promise((resolve, reject) => {
var sqlParams = [];
var sql = "UPDATE User SET";
//[...]
sql += ";";
pool.getConnection((err, connection) => {
if(err) {
reject(err);
return connection.release();
}
connection.query(sql, sqlParams, (error, results, fields) => {
if(error) ? reject(error) : resolve(results.affectedRows == 1);
connection.release();
});
});
})
}
我正在尝试了解如何在另一个 Promise 中解决一个 Promise。
我希望实现的步骤如下:
- 通过
UserManager
(正在运行) 通过其 ID 获取 - 改变其
firstName
- 通过
UserManager
(功能) 将
User
User
保存到数据库
我想测试 UserManager.saveUser(user);
的响应,其中 returns 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)=> ...)
没有 return 任何东西,因此 undefined
return results.affectedRows == 1;
在 lambda 中。它 return 在那个 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);
});
});
})
MySql 是异步的,不 return 承诺。
function queryDB(result) {
return new Promise((resolve, reject) => {
var sqlParams = [];
var sql = "UPDATE User SET";
//[...]
sql += ";";
pool.getConnection((err, connection) => {
if(err) {
reject(err);
return connection.release();
}
connection.query(sql, sqlParams, (error, results, fields) => {
if(error) ? reject(error) : resolve(results.affectedRows == 1);
connection.release();
});
});
})
}