JS шаблон обратного вызова-обещание: хорошая или плохая практика? - PullRequest
0 голосов
/ 28 марта 2020

Я пишу некоторую библиотеку, которая будет предоставлять асинхронные методы, я хочу, чтобы пользователь мог использовать обратные вызовы c класса или современные обещания в зависимости от своих собственных предпочтений.

Я кодировал две версии каждого метода, называя их «myMethod» и «myMethodPromise», и мне в голову пришла мысль:

Почему бы не кодировать метод, объединяющий два шаблона?

Один единственный метод с необязательным аргументом обратного вызова, если не указан, то метод возвращает обещание вместо вызова обратного вызова.

Было бы хорошо практика?

// Promise-callback combined pattern method
function myAsyncMethod ( callback = null ) {
	if(callback) {
  	var result = "xxx";
  	// Do something...
		callback(result);
    } else {
  	  return(new Promise((res, rej) => {
        var result = "xxx";
        // Do something...
        res(result);
    }))
  }
}

// Usage with callback
myAsyncMethod((result)=>document.getElementById('callbackSpan').innerHTML = result);
// or with promise
myAsyncMethod().then((result) => document.getElementById('promiseSpan').innerHTML = result);
<p>
Result with callback : <span id="callbackSpan"></span>
</p>
<p>
Result with promise : <span id="promiseSpan"></span>
</p>

**

1 Ответ

0 голосов
/ 28 марта 2020

Вы можете следовать request-promise модуля. У них есть обертка request module внутри request-promise. А так же записан только небольшой файл конфигурации для назначения всех многообещающих методов.

Подробнее: https://github.com/request/request-promise/blob/master/lib/rp.js

Также можно использовать узел -promisify для обещания метода.

const util = require('util');
const fs = require('fs');

const stat = util.promisify(fs.stat);
stat('.').then((stats) => {
  // Do something with `stats`
}).catch((error) => {
  // Handle the error.
});

// Модуль запроса

Bluebird.config({cancellation: true});

configure({
    request: request,
    PromiseImpl: Bluebird,
    expose: [
        'then',
        'catch',
        'finally',
        'cancel',
        'promise'
        // Would you like to expose more Bluebird methods? Try e.g. `rp(...).promise().tap(...)` first. `.promise()` returns the full-fledged Bluebird promise.
    ],
    constructorMixin: function (resolve, reject, onCancel) {
        var self = this;
        onCancel(function () {
            self.abort();
        });
    }
});

request.bindCLS = function RP$bindCLS() {
    throw new Error('CLS support was dropped. To get it back read: https://github.com/request/request-promise/wiki/Getting-Back-Support-for-Continuation-Local-Storage');
};
...