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]: мне нужно, чтобы он применялся к куче функций (например, ко всем экспортам), и пользователю этих функций не нужно импортировать что-либо еще.