Как создать три функции с одинаковыми именами, одна - обратный вызов, вторая - обещание, другая - асинхронная / ожидание. - PullRequest
0 голосов
/ 07 февраля 2019

Я хочу создать функцию, которую можно использовать тремя способами для создания зависимости npm

  1. Путь обещания

  2. путь обратного вызова

  3. асинхронный / ожидающий способ

Например,

1) асинхронный / ожидающий

var mongoose = require('mongoose');
async function Connection() {
    try {
        await mongoose.connect('mongourl');
    } catch (err) {
        console.error("Connection error --->", err);
    }
}
Connection();

2) Стиль обратного вызова

var mongoose = require('mongoose');
mongoose.connect('mongourl', function (err) {
    if (err) console.error("Connection error --->", err);
});

3) Стиль обещания

var mongoose = require('mongoose');
mongoose.connect('mongourl').then(() => {

}).catch(err => console.error("Connection error --->", err));

впитать, что mongoose.connect одинаково для всех типов

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Вот пример, он похож на @hsz, но я поместил обработку для внутреннего обратного вызова.

Если вы передаете обратный вызов, он делает это способом обратного вызова, если нет, возвращаетОбещание вместо этого.

Если вы запустите фрагмент, вы сможете увидеть его в действии.Я в основном создал простую функцию setTimeout, которая случайным образом завершается ошибкой, чтобы показать, как выполняется обработка ошибок.Чтобы увидеть полный эффект, попробуйте запустить фрагмент несколько раз.

function doInner(name, callback) {
  setTimeout(() => {
    if (Math.random() < 0.5)
      callback(null, "Did " + name);
    else callback(new Error("Oops in " + name));
  }, 1000);
}

function doSomething(name, callback) {
  if (callback) {
    doInner(name, (err, result) => {
      if (callback) callback(err, result);
    });
  } else return new Promise((resolve, reject) => {
    doInner(name, (err, result) => {
      if (err) reject(err);
      else resolve(result);
    });    
  });
}


//now lets test both ways

doSomething("test callback", (err, result) => {
  if (err) console.error(err);
  else console.log(result);
});

(async function () {
  try {
    const result = await doSomething("Promise");
    console.log(result);
  } catch(e) {
    console.error(e);
  }
}());
0 голосов
/ 07 февраля 2019

Вы можете попробовать:

const connect = (name, callback) => {
  try {
    const result = /* generate result */

    if (callback) {
      callback(null, result);
    } else {
      return Promise.resolve(result);
    }
  } catch (e) {
    if (callback) {
      callback(e);
    } else {
      return Promise.reject(e);
    }
  }
}

И пример быстрого использования:

connect('John')
  .then(result => { /* ... */ })
  .catch(error => { /* ... */ });

connect('John', (error, result) => { /* ... */ });

async function foo() {
  try {
    const result = await connect('John');
  } catch (error) { /* ... */ }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...