我真的被承诺在承诺之间传递价值,我想知道我是否可以在这里得到帮助。 我在CustomerRepo中有一个CustomerController调用方法
let getCustomers = customerRepo.getCustomers(req.query.offset, req.query.return);
let getProfiles = customerRepo.getProfiles(rows);
getCustomers
.then(function (rows) {
console.log(rows[0]);
})
.then(getProfiles)
我不知道如何将行(客户数组)传递给getProfiles,因此我可以使用配置文件填充客户对象。 以下是CustomerRepo中的代码 -
var getCustomers = function (offset, _return) {
return new Promise(function (resolve, reject) {
var sqlString = 'call qsel_customers' + '(' + offset + ',' + _return + ')';
pool.getConnection(function (err, connection) {
if (err) {
return reject(err);
}
connection.query(sqlString, function (err, rows) {
if (err) {
reject(err);
}
else
resolve(rows);
connection.release();
});
connection.on('error', function (err) {
res.json({"code": 100, "status": "Error in connection database"});
});
});
});
}
和getProfiles
var getProfiles = function (rows) {
return new Promise(function (resolve, reject) {
console.log(rows);
}
}
我得到的行未定义。还有人可以建议我如何将db mysql连接代码提取到dbConnect.js中,以避免代码重复。
答案 0 :(得分:2)
Promise表示在某个时间点可能失败或不失败的计算。因此,为了创建一个Promise,你可以:
return new Promise(function(resolve, reject) {
// here you decide when the computation fails and when succeeds
resolve(1) // success
reject('error') // failed
})
Promise有一种叫做then
的方法(确实是一种瑞士刀)。它需要一个参数的函数f。现在,ƒ的魔力看起来像这样:
如果ƒ返回简单值(字符串,数字,数组等),那么它会将其包装在新的Promise中并返回它。签名是then : Promise[a] -> (a -> b) -> Promise[b]
。因此,假设你有一个函数∂返回一个数字的Promise,ƒ取一个数字并添加“!”对它,你得到这个数字,用then
传递给ƒ并最终得到一个新的承诺:
ƒ.then(n => n +'!')//承诺[String]
如果ƒ返回一个Promise,那么then
将“提取”该值,如果这个Promise,将它传递给∂并返回一个带有结果的新Promise。在伪代码中:
ƒ.then(n => Promise(n +'!'))//承诺[String]
好的,then
会返回一个承诺。好吧,让我们设计一下代码:
let getCustomers = () => Promise.resolve([ {}, {}, {} ])
// assume myApi.getProfile takes a Customer and returns a Profile
let getProfiles = (customers) => customers.map(myApi.getProfile)
getCustomers().then(getProfiles).then(console.log.bind(console));
答案 1 :(得分:1)
我不是Promises的专家,但我不认为将pool.getConnection
放在getCustomers
承诺中是个好主意。
它看起来像是另一个承诺,应该被链接而不是合并。
回到你的主要版本。你可以这样做
getCustomers
.then(function (rows) {
return getProfiles(rows);
})
.then(function() {
console.log('get profiles resolved');
});
和
var getProfiles = function (rows) {
return new Promise(function (resolve, reject) {
resolve(rows);
console.log('other log of rows:' + rows);
}
}
<强>编辑:强>
let getCustomers = customerRepo.getCustomers(req.query.offset, req.query.return);
let getProfiles = customerRepo.getProfiles;
getCustomers
.then(function (rows) {
return getProfiles(rows);
})
.then(function(rows) {
console.log('rows number ' + rows);
console.log('get profiles resolved');
);
答案 2 :(得分:1)
当链接Promises时,你必须返回一个Promise,它使用你从上游函数传递的值来解析,以便在下游函数中使用它。
getCustomers
.then(function (rows) {
console.log(rows[0]);
return Promise.resolve(rows[0]);
})
.then(function(firstRow) {
console.log("The first row's id is " + firstRow.id);
return Promise.resolve(firstRow);
})
.then(getProfiles);
如果需要在其中一个函数中执行异步工作,请返回一个新的Promise并在异步回调中适当地调用resolve / reject函数。 Promise.resolve()
是您可以使用的快捷方式,如果您没有异步执行任何操作;它只返回一个Promise对象,该对象用它传递的值解析。