使用multiple更正JavaScript的求值顺序
我很难让这段代码在JavaScript中同步 注释(1、2和3)说明了按顺序发生的事情,现在它在可能创建新酒吧之前保存了所有者 我需要findOne,可能是saveBar,然后是saveOwner使用multiple更正JavaScript的求值顺序,javascript,node.js,promise,Javascript,Node.js,Promise,我很难让这段代码在JavaScript中同步 注释(1、2和3)说明了按顺序发生的事情,现在它在可能创建新酒吧之前保存了所有者 我需要findOne,可能是saveBar,然后是saveOwner function setMyBar(req, res, next) { const owner = req.queryOwner; Bar.findOne({ placeId: req.body.placeId }) .then((bar) => { if
function setMyBar(req, res, next) {
const owner = req.queryOwner;
Bar.findOne({
placeId: req.body.placeId
})
.then((bar) => {
if(bar){
owner.bar = bar; //1
return owner;
}else{
barCtrl.saveBar(req.body.name, req.body.placeId, req.body.longitude, req.body.latitude)
.then((savedBar) => {
owner.bar = savedBar; //3
return owner;
})
.catch(e => {return Promise.reject(err) })
}
}).then(() => {
owner.save()
.then(savedOwner => res.json(savedOwner)) //2
.catch(e => next(e));
})
.catch(e => next(e));
}
您需要在第一个
条件中返回承诺,然后在else
条件中返回()。现在没有返回任何内容,因此它会跳转到下一个,然后在barCtrl.saveBar()
解析之前跳转到下一个
试一试
您需要在第一个条件中返回承诺,然后在else
条件中返回()。现在没有返回任何内容,因此它会跳转到下一个,然后在barCtrl.saveBar()
解析之前跳转到下一个
试一试
试试这个
function setMyBar(req, res, next) {
const owner = req.queryOwner;
Bar.findOne({
placeId: req.body.placeId
})
.then((bar) => {
if(bar){
owner.bar = bar; //1
return owner;
}else{
// return should do the magic
return barCtrl.saveBar(req.body.name, req.body.placeId, req.body.longitude, req.body.latitude)
.then((savedBar) => {
owner.bar = savedBar; //3
return owner;
})
.catch(e => {return Promise.reject(err) })
}
}).then(() => {
owner.save()
.then(savedOwner => res.json(savedOwner)) //2
.catch(e => next(e));
})
.catch(e => next(e));
}
当你在承诺范围内归还某物时,它将作为承诺归还。
而要想实现承诺,你当前的承诺必须回报一个承诺。你不做的地方试试这个
function setMyBar(req, res, next) {
const owner = req.queryOwner;
Bar.findOne({
placeId: req.body.placeId
})
.then((bar) => {
if(bar){
owner.bar = bar; //1
return owner;
}else{
// return should do the magic
return barCtrl.saveBar(req.body.name, req.body.placeId, req.body.longitude, req.body.latitude)
.then((savedBar) => {
owner.bar = savedBar; //3
return owner;
})
.catch(e => {return Promise.reject(err) })
}
}).then(() => {
owner.save()
.then(savedOwner => res.json(savedOwner)) //2
.catch(e => next(e));
})
.catch(e => next(e));
}
当你在承诺范围内归还某物时,它将作为承诺归还。
而要想实现承诺,你当前的承诺必须回报一个承诺。如果您不这样做您可以通过使用承诺链简化很多:
function setMyBar(req, res, next) {
Bar.findOne({
placeId: req.body.placeId
}).then(bar => {
if (bar) {
return bar;
} else {
return barCtrl.saveBar(req.body.name, req.body.placeId, req.body.longitude, req.body.latitude);
}
}).then(savedBar => {
const owner = req.queryOwner;
owner.bar = savedBar;
return owner.save();
}).then(savedOwner => {
res.json(savedOwner);
}, e => {
next(e);
});
}
重要的变化是:
return
保存栏
承诺等待它,您可以在下一次(外部)回调中使用它的结果,然后
回调
将ownwer.bar
赋值放在下一个回调中,如果查询已经找到它,只需返回bar
,以避免代码重复
删除无意义的.catch(e=>{return Promise.reject(err)})
通过使用承诺链,您可以简化很多:
function setMyBar(req, res, next) {
Bar.findOne({
placeId: req.body.placeId
}).then(bar => {
if (bar) {
return bar;
} else {
return barCtrl.saveBar(req.body.name, req.body.placeId, req.body.longitude, req.body.latitude);
}
}).then(savedBar => {
const owner = req.queryOwner;
owner.bar = savedBar;
return owner.save();
}).then(savedOwner => {
res.json(savedOwner);
}, e => {
next(e);
});
}
重要的变化是:
return
保存栏
承诺等待它,您可以在下一次(外部)回调中使用它的结果,然后
回调
将ownwer.bar
赋值放在下一个回调中,如果查询已经找到它,只需返回bar
,以避免代码重复
删除无意义的.catch(e=>{return Promise.reject(err)})
您还可以尝试使用ES7异步函数或异步/等待语法,这使您可以编写更加同步的代码,如果您愿意,代码仍然异步并行执行。它在所有主流浏览器的当前版本(IE除外)以及Node.js使用的Google的V8引擎中都受支持
我很快就破解了你的代码,使用了异步/等待语法,其中可能有奇怪的错误,因为我只是想告诉你使用异步函数的好处。它应该是这样的:
async function setMyBar(req, res, next) {
const owner = req.queryOwner;
try {
let bar = await Bar.findOne({
placeId: req.body.placeId
});
if (bar) {
owner.bar = bar;
} else {
let savedBar = await barCtrl.saveBar(req.body.name, req.body.placeId, req.body.longitude, req.body.latitude);
owner.bar = savedBar;
}
res.json(await owner.save());
} catch (e) {
next(e);
}
}
还要注意,异步函数声明中的async关键字确保函数始终返回承诺
一些很好的链接可以阅读该功能,还提供了一些关于承诺的进一步背景信息:
您还可以尝试使用ES7异步函数或异步/等待语法,这使您可以编写更加同步的代码,如果您愿意,代码仍然异步并行执行。它在所有主流浏览器的当前版本(IE除外)以及Node.js使用的Google的V8引擎中都受支持
我很快就破解了你的代码,使用了异步/等待语法,其中可能有奇怪的错误,因为我只是想告诉你使用异步函数的好处。它应该是这样的:
async function setMyBar(req, res, next) {
const owner = req.queryOwner;
try {
let bar = await Bar.findOne({
placeId: req.body.placeId
});
if (bar) {
owner.bar = bar;
} else {
let savedBar = await barCtrl.saveBar(req.body.name, req.body.placeId, req.body.longitude, req.body.latitude);
owner.bar = savedBar;
}
res.json(await owner.save());
} catch (e) {
next(e);
}
}
还要注意,异步函数声明中的async关键字确保函数始终返回承诺
一些很好的链接可以阅读该功能,还提供了一些关于承诺的进一步背景信息:
使用承诺不会使代码同步。它只是有助于使异步代码有序。使用承诺并不能使代码同步。它只是有助于使异步代码顺序化。