节点js中的顺序请求
sequential request in node js
我正在学习使用 express 库在节点 js 中制作 API
我有两件事:产品,订单
每个订单都有一个地址,一个或多个产品以及基于产品价格的总价
当我尝试保存订单时,我只是传递了产品 ID,所以在代码中我应该获取产品并对它们的价格求和,而且我想在响应中显示产品,所以我所做的就是将 ID 放入一个数组中,然后我执行了数组中的 foreach 循环,在每个循环中我得到产品并将其推送到数组中。
问题是在我得到产品之前执行了响应(实际上是 foreach 循环之后的每个代码),
我搜索了 Async/Await 并尝试实现它,但没有成功
我的代码是这样的
function getproductpromis(options){
return new Promise((resolve,reject) =>{
http.get(options, resolt =>{
let data ;
resolt.on('data', d => {
data +=d;
})
resolt.on('end', f =>{
resolve (data);
})
resolt.on('error', e =>{
reject(e);
console.log(e);
})
});
});
}
async function getproduct(element){
let object;
const options = {
hostname:'localhost',
port:5000,
path:'/products/'+element,
mathod:'GET'
}
const request_call = await getproductpromis(options);
console.log('request_call');
console.log(request_call);
return request_call;
}
router.post('/',(req,res,next) => {
let prod;
console.log(req.body.products);
const ids = req.body.products;
let totalprice = 0;
let objects =[];
ids.forEach(element => {
prod = getproduct(element);
console.log('prod');
console.log(prod);
objects.push(prod);
});
res.status(200).json({
objects
});
}
这是我的日志:
[ '5dab2706baab4b1e90dc30ff', '5dab2792f0662d4f54bbf1f1' ]
prod
Promise { <pending> }
prod
Promise { <pending> }
POST /orders 200 56.974 ms - 19
{ _id: 5dab2706baab4b1e90dc30ff,
name: 'langero',
quantity: 5,
price: 1500,
__v: 0 }
GET /products/5dab2706baab4b1e90dc30ff 200 208.973 ms - 114
request_call
undefined{"massage":"product found","product":{"ID":"5dab2706baab4b1e90dc30ff","name":"langero","quantity":5,"price":1500}}
{ _id: 5dab2792f0662d4f54bbf1f1,
name: 'langer',
quantity: 5,
price: 1500,
__v: 0 }
GET /products/5dab2792f0662d4f54bbf1f1 200 1172.254 ms - 113
request_call
undefined{"massage":"product found","product":{"ID":"5dab2792f0662d4f54bbf1f1","name":"langer","quantity":5,"price":1500}}
和我在邮递员那里得到的回应
response
所以你想要执行和一系列 Promise,你在正确的轨道上,但我可以为你指出 Async/Await. Here I marked your router.post
callback as async
so I can use await
. I use Array.map to return an array of promises that get passed to Promise.all
的方向
router.post("/", async (req, res, next) => {
const ids = req.body.products;
const objects = await Promise.all(
ids.map((id) => {
return getproduct(id);
})
);
res.status(200).json({
objects
});
});
将 forEach
循环更改为 for...of
循环
[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of]
这是您使用 async/await
和 for...of
循环
更新后的 router.post
router.post('/',async (req,res,next) => {
let prod;
console.log(req.body.products);
const ids = req.body.products;
let totalprice = 0;
let objects =[];
for (let element of ids) {
prod = await getproduct(element);
console.log('prod');
console.log(prod);
objects.push(prod);
}
res.status(200).json({
objects
});
}
我正在学习使用 express 库在节点 js 中制作 API 我有两件事:产品,订单 每个订单都有一个地址,一个或多个产品以及基于产品价格的总价 当我尝试保存订单时,我只是传递了产品 ID,所以在代码中我应该获取产品并对它们的价格求和,而且我想在响应中显示产品,所以我所做的就是将 ID 放入一个数组中,然后我执行了数组中的 foreach 循环,在每个循环中我得到产品并将其推送到数组中。 问题是在我得到产品之前执行了响应(实际上是 foreach 循环之后的每个代码), 我搜索了 Async/Await 并尝试实现它,但没有成功 我的代码是这样的
function getproductpromis(options){
return new Promise((resolve,reject) =>{
http.get(options, resolt =>{
let data ;
resolt.on('data', d => {
data +=d;
})
resolt.on('end', f =>{
resolve (data);
})
resolt.on('error', e =>{
reject(e);
console.log(e);
})
});
});
}
async function getproduct(element){
let object;
const options = {
hostname:'localhost',
port:5000,
path:'/products/'+element,
mathod:'GET'
}
const request_call = await getproductpromis(options);
console.log('request_call');
console.log(request_call);
return request_call;
}
router.post('/',(req,res,next) => {
let prod;
console.log(req.body.products);
const ids = req.body.products;
let totalprice = 0;
let objects =[];
ids.forEach(element => {
prod = getproduct(element);
console.log('prod');
console.log(prod);
objects.push(prod);
});
res.status(200).json({
objects
});
}
这是我的日志:
[ '5dab2706baab4b1e90dc30ff', '5dab2792f0662d4f54bbf1f1' ]
prod
Promise { <pending> }
prod
Promise { <pending> }
POST /orders 200 56.974 ms - 19
{ _id: 5dab2706baab4b1e90dc30ff,
name: 'langero',
quantity: 5,
price: 1500,
__v: 0 }
GET /products/5dab2706baab4b1e90dc30ff 200 208.973 ms - 114
request_call
undefined{"massage":"product found","product":{"ID":"5dab2706baab4b1e90dc30ff","name":"langero","quantity":5,"price":1500}}
{ _id: 5dab2792f0662d4f54bbf1f1,
name: 'langer',
quantity: 5,
price: 1500,
__v: 0 }
GET /products/5dab2792f0662d4f54bbf1f1 200 1172.254 ms - 113
request_call
undefined{"massage":"product found","product":{"ID":"5dab2792f0662d4f54bbf1f1","name":"langer","quantity":5,"price":1500}}
和我在邮递员那里得到的回应 response
所以你想要执行和一系列 Promise,你在正确的轨道上,但我可以为你指出 Async/Await. Here I marked your router.post
callback as async
so I can use await
. I use Array.map to return an array of promises that get passed to Promise.all
router.post("/", async (req, res, next) => {
const ids = req.body.products;
const objects = await Promise.all(
ids.map((id) => {
return getproduct(id);
})
);
res.status(200).json({
objects
});
});
将 forEach
循环更改为 for...of
循环
[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of]
这是您使用 async/await
和 for...of
循环
router.post
router.post('/',async (req,res,next) => {
let prod;
console.log(req.body.products);
const ids = req.body.products;
let totalprice = 0;
let objects =[];
for (let element of ids) {
prod = await getproduct(element);
console.log('prod');
console.log(prod);
objects.push(prod);
}
res.status(200).json({
objects
});
}