Обещания и async / await в nodejs - PullRequest
0 голосов
/ 04 октября 2018

Мой пример кода:

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();
 });

Теперь он отлично работает,

Мой вопрос: как заменить этот небольшой код обещаниями и асинхронным ожиданием вместо обратных вызовов?

Ответы [ 4 ]

0 голосов
/ 04 октября 2018

как вы заменяете этот маленький код обещаниями и асинхронными, а не обратными вызовами

Итак, есть 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

Приветствия,

0 голосов
/ 04 октября 2018

Таким образом, ваш текущий подход уже основан на обещаниях, вы можете добавить console.log непосредственно в name = 'sameer'; и получить результат, который вы ищете.Смотрите здесь для ознакомления с прототипом обещаний - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

Login.findOne().then(() => {
   name = 'sameer';
   console.log(name);
 });

Если вы хотите использовать async / await, вам нужно обернуть эту логику в асинхронную функцию, но затем вы можете использовать ее следующим образом:это:

async function someFunction() { 
    const resultFromFindOne = await Login.findOne();
    name = 'sameer';
    console.log(name)
}
0 голосов
/ 04 октября 2018

Хотя вы можете использовать анонимные функции, я просто собираюсь объявить функцию с именем 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.

async function doLogin() {
     try {
       const name = await Login.findOne()
       printName(name)
     } catch(e) {
       console.error(e)
     }
}
0 голосов
/ 04 октября 2018

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);
});

Сохранитьпомните, что await может использоваться только внутри функции async, поэтому рано или поздно вам все равно придется использовать .then(), чтобы увидеть, когда все будет сделано.Но во многих случаях использование await может упростить последовательные асинхронные операции.

Имеет гораздо большую разницу, если у вас есть несколько последовательных асинхронных операций:

async function doIt() {
    let result1 = await someFunc1();
    let result2 = await someFunc2(result1 + 10);
    return someFunc3(result2 * 100);
}

Без ожидания это будетbe:

function doIt() {
    return someFunc1().then(result1 => {
        return someFunc2(result1 + 10);
    }).then(result2 => {
        return someFunc3(result2 * 100);
    });
}

Добавьте больше логики для обработки промежуточных результатов или ветвления логического потока, и это становится все более и более сложным без await.

Дополнительные примеры см. Как связать и поделиться предыдущими результатами с Promises и насколько проще версия await.

...