JS: Используйте одну и ту же функцию для двух API: Chainable sync. и обещания

Проблема в том, что если вы хотите использовать ту же функцию синхронно и в Promise, использование arguments будет отличаться, потому что первые аргументы могут прийти от обещания.

Есть ли лучшее решение, чем мой нынешний способ?

В качестве примера - функция, усекающая строку:

синхронизация:

truncate('A very long string coming from a sync. operation', 10);

асинхронный:

Promise.resolve('A very long string coming from a network request')
  .then( truncate(10) )

Асинхронная версия заставит функцию усечения думать, что 10 это строка, и вам нужно будет проверить typeof в каждой функции или делать ducktyping. Что бы работать:

Promise.resolve('A very long string coming from a network request')
  .then( truncate.it(10) )

если вы продлили прототип функции раньше (а это не то, что я хочу):

Function.prototype.it = (function() {
  return function() {
    var args = arguments;
    return function(){
        Array.prototype.push.apply(arguments, args);
        return this.apply(null, arguments);
    }.bind(this);
  };
}());

function foo(a, b, c) {
  console.log('a is ' + a, ' | b is ' + b, ' | c is ' + c);
};

// LOGIC :    
foo(1, 2, 3);
// SAME AS
foo.it(2, 3)(1);
// OR
foo.it(3)(1, 2);
// OR pretty useful for .then()
Promise.resolve(1).then(foo.it(2, 3));

играть на скрипке

[edit]: мне нужно, чтобы он применялся к куче функций (например, ко всем экспортам), и пользователю этих функций не нужно импортировать что-либо еще.

0 ответов

Другие вопросы по тегам