Node.js 开始使用承诺
我开始使用承诺,但我并不完全理解,你能帮我吗。我正在验证通过应用程序发送的所有数据,但仍在加载皮带扣,我不明白为什么 这是我的代码(现在我只是验证Node.js 开始使用承诺,node.js,Node.js,我开始使用承诺,但我并不完全理解,你能帮我吗。我正在验证通过应用程序发送的所有数据,但仍在加载皮带扣,我不明白为什么 这是我的代码(现在我只是验证POST方法,但我只是用它进行测试) var parse=require('querystring')) /* 检查最终值的正则表达式 (不接受特殊字符) */ var dev=函数(数据){ var err=''; 如果(data==未定义的| | data==空的| | data.length'){ //console.log(元素) 验证(元素
POST
方法,但我只是用它进行测试)
var parse=require('querystring'))
/*
检查最终值的正则表达式
(不接受特殊字符)
*/
var dev=函数(数据){
var err='';
如果(data==未定义的| | data==空的| | data.length'){
//console.log(元素)
验证(元素)
新承诺(功能(解决、拒绝){
验证(元素、功能(错误、元素){
如果(错误){
拒绝(错误);
}否则{
决心(要素);
}
});
})
});
}else if(数据类型)=“对象”){
//转换数组上的对象以将其自身传递给check(递归)
console.log('是一个对象')
//console.log(数据)
newdata=Object.values(数据)
新承诺(功能(解决、拒绝){
验证(newdata,函数(err,newdata){
如果(错误){
拒绝(错误);
}否则{
解析(新数据);
}
});
})
}else if(数据类型)=“函数”){
console.log('是一个函数')
//验证(数据())
新承诺(功能(解决、拒绝){
验证(数据(),函数(错误,管道){
如果(错误){
拒绝(错误);
}否则{
解决(管道);
}
});
})
}否则{
//console.log('最后一级数据')
返回新承诺(功能(解决、拒绝){
开发(数据、功能(错误、数据){
如果(错误){
拒绝(错误);
}否则{
解析(数据)
}
})
})
//开发人员(数据)
}
//返回err<1?数据:err;
}
/*
检查请求的方法,并在此基础上通过req上的路径进行验证
(请求主体或请求参数请求查询)
*/
var controlencoder=功能(req、res、next){
//控制台上的打印方法
控制台日志(请求方法)
//检查方法
if(req.method==“PUT”| | req.method==“POST”){
让body='';
让管道='';
请求打开('data',chunk=>{
body+=chunk.toString();
});
请求开启('end',()=>{
pipe=parse.parse(主体)
console.log(管道)
返回新承诺(功能(解决、拒绝){
验证(管道、功能(错误){
如果(错误){
拒绝(错误);
}否则{
解决(管道);
}
});
}).then(next())
});
}否则{
var管道=所需参数
返回新承诺(功能(解决、拒绝){
验证(管道、功能(错误){
如果(错误){
拒绝(错误);
}否则{
解决(管道);
}
});
}).then(next())
//console.log(管道)
}
//变量管道=[req.body,req.params]
}
module.exports=controlencoder;
我只想与您分享关于承诺的一般想法……在您的示例中,您混合了回调和承诺。因此,您无法看到承诺的所有优点。同时,请看下面的示例
function getCustomer() {
return Promise((resolve, reject) => {
// send async request here
// on response execute resolve(res) or catch error with reject(err)
// for example
request
.get('your_address_here')
.on('response', (res) => {
resolve(res)
})
.on('error', (err) => {
reject(err)
});
})
}
function getCustomerOrders(customer) {
return Promise((resolve, reject) => {
// send async request here
// on response execute resolve(res) or catch error with reject(err)
// for example
request
.get('your_address_here')
.on('response', (res) => {
resolve(res)
})
.on('error', (err) => {
reject(err)
});
})
}
//承诺的力量来自于你必须执行功能或解决所有问题(Promise.all)
或者,如果第二个承诺不依赖于第一个承诺的结果,就一起解决它们
Promise.all([getCustomer(), getCustomerOrders()]).then((values) => {
console.log(values[0]); //is the result of getCustomer()
console.log(values[1]); //is the result of getCustomerOrders()
});
承诺的主要缺点是
在所有调用
verify()
和dev()
的地方,都使用两个参数调用它,但这两个函数都只接受一个参数。因此,它们将忽略传入的函数
现在,承诺的重点是摆脱这些回调,所以我想你已经完成了一半。所以让我们让所有承诺都返回承诺,只接受一个论点
让我们回顾一下代码:
开发人员(数据)
新承诺(..{…}
东西,只需调用verify()
.map()
而不是.forEach()
可以收集验证()的返回值
调用,然后生成一个Promise
对象数组。然后我们可以使用函数合并Promise
对象数组。让我们将代码更新为:verify()
调用的承诺结果数组,并且Promise.all()
将它们合并在一起,这样即使一个验证失败,返回的承诺也会失败
} else if (typeof (data) == 'object') {
//Convert the object on Array to pass this itself to check (recursively)
console.log('is an object')
// console.log(data)
newdata = Object.values(data)
new Promise(function (resolve, reject) {
verify(newdata, function (err, newdata) {
if (err) {
reject(err);
} else {
resolve(newdata);
}
});
})
承诺时,无需创建新的承诺对象。让我们更新到:
} else if (typeof (data) == 'object') {
//Convert the object on Array to pass this itself to check (recursively)
console.log('is an object');
// console.log(data);
newdata = Object.values(data);
return verify(newdata);
} else if (typeof (data) == 'function') {
console.log('is a function')
// verify(data())
new Promise(function (resolve, reject) {
verify(data(), function (err, pipe) {
if (err) {
reject(err);
} else {
resolve(pipe);
}
});
})
更改为:
} else if (typeof (data) == 'function') {
console.log('is a function');
return verify(data());
最后:
} else {
// console.log('last level of data')
return new Promise(function(resolve, reject){
dev(data, function(err, data){
if(err){
reject(err);
} else {
resolve(data)
}
})
})
// dev(data)
}
// return err < 1 ? data : err;
}
控制编码器(req、res、next)
将此更改为:
var controlencoder = function (req, res, next) {
//Print method on console
console.log(req.method)
//check the method
if (req.method == 'PUT' || req.method == 'POST') {
let body = '';
let pipe = '';
req.on('data', chunk => {
body += chunk.toString();
});
req.on('end', () => {
pipe = parse.parse(body)
console.log(pipe)
return verify(pipe).then(next());
});
这是:
} else {
var pipe = req.params
return new Promise(function (resolve, reject) {
verify(pipe, function (err) {
if (err) {
reject(err);
} else {
resolve(pipe);
}
});
}).then(next())
// console.log(pipe)
}
// var pipe = [req.body, req.params]
}
……为此:
} else {
var pipe = req.params
return verify(pipe).then(next());
// console.log(pipe)
}
// var pipe = [req.body, req.params]
}
希望它能起作用:)你有一个合作伙伴
} else {
// console.log('last level of data')
return new Promise(function(resolve, reject){
dev(data, function(err, data){
if(err){
reject(err);
} else {
resolve(data)
}
})
})
// dev(data)
}
// return err < 1 ? data : err;
}
} else {
// console.log('last level of data')
return dev(data);
}
// return err < 1 ? data : err;
}
var controlencoder = function (req, res, next) {
//Print method on console
console.log(req.method)
//check the method
if (req.method == 'PUT' || req.method == 'POST') {
let body = '';
let pipe = '';
req.on('data', chunk => {
body += chunk.toString();
});
req.on('end', () => {
pipe = parse.parse(body)
console.log(pipe)
return new Promise(function (resolve, reject) {
verify(pipe, function (err) {
if (err) {
reject(err);
} else {
resolve(pipe);
}
});
}).then(next())
});
var controlencoder = function (req, res, next) {
//Print method on console
console.log(req.method)
//check the method
if (req.method == 'PUT' || req.method == 'POST') {
let body = '';
let pipe = '';
req.on('data', chunk => {
body += chunk.toString();
});
req.on('end', () => {
pipe = parse.parse(body)
console.log(pipe)
return verify(pipe).then(next());
});
} else {
var pipe = req.params
return new Promise(function (resolve, reject) {
verify(pipe, function (err) {
if (err) {
reject(err);
} else {
resolve(pipe);
}
});
}).then(next())
// console.log(pipe)
}
// var pipe = [req.body, req.params]
}
} else {
var pipe = req.params
return verify(pipe).then(next());
// console.log(pipe)
}
// var pipe = [req.body, req.params]
}