Javascript 如何在承诺链中传递参数
我真的很难在承诺之间传递价值观,我想知道我是否能在这里得到帮助。 我有一个CustomerController在CustomerRepo中调用方法Javascript 如何在承诺链中传递参数,javascript,node.js,Javascript,Node.js,我真的很难在承诺之间传递价值观,我想知道我是否能在这里得到帮助。 我有一个CustomerController在CustomerRepo中调用方法 let getCustomers = customerRepo.getCustomers(req.query.offset, req.query.return); let getProfiles = customerRepo.getProfiles(rows); getCustomers .then(function (rows) {
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,以便用概要文件填充customers对象。
以下是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中,以避免代码重复。我不是承诺方面的专家,但我认为将
pool.getConnection
放在getCustomers
承诺中不是一个好主意。
这看起来像是另一个承诺,应该被捆绑起来,而不是结合起来
回到你的主要问题上来。你可以这样做
getCustomers
.then(function (rows) {
return getProfiles(rows);
})
.then(function() {
console.log('get profiles resolved');
});
及
编辑:
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');
);
我不是承诺方面的专家,但我不认为将
pool.getConnection
放在getCustomers
承诺中是个好主意。
这看起来像是另一个承诺,应该被捆绑起来,而不是结合起来
回到你的主要问题上来。你可以这样做
getCustomers
.then(function (rows) {
return getProfiles(rows);
})
.then(function() {
console.log('get profiles resolved');
});
及
编辑:
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');
);
链接承诺时,必须返回一个承诺,该承诺使用从上游函数传递的值进行解析,以便在下游函数中使用它
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);
如果需要在其中一个函数中执行异步工作,请返回一个新的承诺,并在异步回调中适当地调用resolve/reject函数
Promise.resolve()
是一种快捷方式,如果您不异步执行任何操作,可以使用它;它只返回一个用传递的值解析的承诺对象。链接承诺时,必须返回一个用从上游函数传递的值解析的承诺,才能在下游函数中使用它
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);
如果需要在其中一个函数中执行异步工作,请返回一个新的承诺,并在异步回调中适当地调用resolve/reject函数
Promise.resolve()
是一种快捷方式,如果您不异步执行任何操作,可以使用它;它只返回一个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
。它采用一个参数的函数。现在,ƒ的魔力是这样的:
- 如果ƒ返回简单的值(字符串、数字、数组等),那么它将用一个新的Promise封装它并返回它。签名是
。因此,假设你有一个函数∂ 它返回一个数字的承诺,然后ƒ取一个数字并在其中添加“!”,你得到这个数字,然后使用then:Promise[a]->(a->b)->Promise[b]
将它传递给ƒ,然后使用
得到一个新的承诺: ƒ.then(n=>n+'!')///Promise[String]
- 如果ƒ返回一个承诺,则
将“提取”该承诺的值,如果该承诺传递给∂ 并返回一个新的承诺和结果。在伪代码中: ƒ.then(n=>Promise(n+'!')//Promise[String]然后
然后
返回一个承诺。那么,让我们设计代码:
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));
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
。它采用一个参数的函数。现在,ƒ的魔力是这样的:
- 如果ƒ返回简单的值(字符串、数字、数组等),那么它将用一个新的Promise封装它并返回它。签名是
。因此,假设你有一个函数∂ 它返回一个数字的承诺,然后ƒ取一个数字并在其中添加“!”,你得到这个数字,然后使用then:Promise[a]->(a->b)->Promise[b]
将它传递给ƒ,然后使用
得到一个新的承诺: ƒ.then(n=>n+'!')///Promise[String]
- 如果ƒ返回一个承诺,则
将“提取”该承诺的值,如果该承诺传递给∂ 并返回一个新的承诺和结果。在伪代码中: ƒ.then(n=>Promise(n+'!')//Promise[String]然后
然后
返回一个承诺。那么,让我们设计代码:
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));
而不是
。然后(getProfiles)
做。然后(function(){getProfiles(…)})
@marekful你是这个意思。然后(function(){getProfiles(rows)}?而不是。然后(getProfiles)
做。然后(function(){getProfiles(…)})
@marekful你是这个意思。然后(function(){getProfiles(rows)}),我真的觉得编码承诺非常令人困惑,我想定下一个版本的承诺代码的工作。有没有办法将sql查询抽象为承诺?特别是在链接多个查询时?假设您使用ES6,您最好使用产生多个查询。我很欣赏您的评论,我真的觉得编码承诺非常令人困惑,我想确定一个有效的承诺代码版本。有没有办法将sql查询抽象为承诺?尤其是在链接多个查询时?假设您使用ES6,您可能会更好地使用产生多个查询。我明白为什么我会感到困惑,尤其是对于初学者,有很多方法可以做同样的事情。我希望我能找到一个详细的博客/图坦卡蒙来浏览它。不管怎样,这实际上是一个糟糕设计的问题:映射、链接、错误映射的唯一方法。。。我希望,我的帖子是有帮助的。顺便说一句,这里有一个很好的教程。谢谢伊万,是的,非常有帮助。我明白为什么我会感到困惑,特别是对于初学者来说,做同样的事情有很多方法。我希望我能找到一个详细的博客/图坦卡蒙来浏览它。无论如何,谢谢你,是的,这实际上是一个糟糕设计的问题:遇到的那个