繁体   English   中英

Node.js中的承诺和异步/等待

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM