[英]have some issue about handling async await and promises in js and nodejs
[英]Promises and async/await in nodejs
我的示例代码:
let name;
Login.findOne().then(() => {
name = 'sameer';
}); // consider this is async code
console.log(name);
所以上面的代码异步工作,所以现在我的console.log变得不确定。
我使用回调使代码像同步一样工作。
我的回调代码:
let name;
const callback = () => {
console.log(name);
};
Login.findOne().then(() => {
name = 'sameer';
callback();
});
现在它可以完美地工作了,
我的问题是,如何用promise和async await代替回调来代替此小代码?
await
,您可以以某种同步的方式编写异步代码:
async function doIt() {
let name = await Login.findOne();
console.log(name);
// You can use the result here
// Or, if you return it, then it becomes the resolved value
// of the promise that this async tagged function returns
return name;
}
// so you can use `.then()` to get that resolved value here
doIt().then(name => {
// result here
}).catch(err => {
console.log(err);
});
简单的承诺版本将是这样的:
function doIt() {
// make the query, return the promise
return Login.findOne();
}
// so you can use `.then()` to get that resolved value here
doIt().then(name => {
// result here
}).catch(err => {
console.log(err);
});
请记住,只能在async
函数内部使用await
因此迟早还是经常需要使用.then()
来查看何时完成所有操作。 但是,很多时候,使用await
可以简化顺序异步操作。
如果您有多个顺序的异步操作,它将带来更多不同:
async function doIt() {
let result1 = await someFunc1();
let result2 = await someFunc2(result1 + 10);
return someFunc3(result2 * 100);
}
如果没有等待,这将是:
function doIt() {
return someFunc1().then(result1 => {
return someFunc2(result1 + 10);
}).then(result2 => {
return someFunc3(result2 * 100);
});
}
添加更多的逻辑来处理中间结果或逻辑流程的分支,它变得越来越复杂,而无需await
。
有关更多示例,请参见如何与Promises链接和共享先前的结果,以及await
版本更简单。
因此,您当前的方法已经基于承诺,您可以直接在name = 'sameer';
下添加console.log name = 'sameer';
并获得您想要的结果。 请参阅此处以查看promise原型的概述-https: //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/then
Login.findOne().then(() => {
name = 'sameer';
console.log(name);
});
如果要使用async / await,则需要将此逻辑包装在async函数中,但是您可以这样使用它:
async function someFunction() {
const resultFromFindOne = await Login.findOne();
name = 'sameer';
console.log(name)
}
尽管可以使用匿名函数,但为清楚起见,我将像这样声明一个名为printName的函数。
function printName(name) {
// if name provided in param, then print the name, otherwise print sameer.
console.log(name || 'sameer')
}
有了承诺,您可以执行以下操作:
Login.findOne().then(printName).catch(console.error)
与异步/等待。 它必须在声明为异步的函数中。
async function doLogin() {
try {
const name = await Login.findOne()
printName(name)
} catch(e) {
console.error(e)
}
}
如何用promise和async等待而不是回调替换此小代码
到这里,有2种方法可以做到:
/* Let's define a stand-in for your Login object so we can use Stack Snippets */ const Login = { findOne: (name) => Promise.resolve(name) // dummy function } /* using promises */ Login.findOne('sameer') .then(name => name.toUpperCase()) // the thing you return will be passed to the next 'then'. Let's uppercase just for fun .then(name => console.log('**FROM PROMISE**', name)) /* using async/await */ async function main() { // (A) only inside async can you use await const name = await Login.findOne('sameer') // as mentioned in (A) console.log('**FROM AWAIT**', name) } main() // trigger our async/await test
干杯,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.