Я пытаюсь сделать небольшую функцию полезности toPromise
, которая преобразует функцию с помощью обратного вызова в функцию обещания (используя Q). Вот утилита:Aplating аргументы в javascript не работают
Object.defineProperty(Function.prototype, "toPromise", {
enumerable: false,
configurable: false,
writable: false,
value: function(self) {
var $this;
$this = this;
return function() {
var args, deferred;
deferred = Q.defer();
args = arguments;
args[args.length] = deferred.resolve;
console.dir(args);
$this.apply(self, args);
return deferred.promise;
};
}
});
Здесь использование:
var f = function(nickname, name, callback){
console.log(arguments)
callback(undefined, name+" "+nickname);
};
f.toPromise(this)("a", "b").then(function(str){
console.log(str)
});
Но выход:
{ '0': 'a', '1': 'b', '2': [Function] } // This is debugging from utils
{ '0': 'a', '1': 'b' } // and from the function f
C:\test.js:4
callback(undefined, name+" "+nickname);
^
TypeError: undefined is not a function
Так почему же третий аргумент (в утилитах), функция , не прошел в apply
?
Случайная догадка: конвертировать 'аргументы' в массив перед назначением' args' – Kos
@Kos спасибо! Это сработало. Отправьте ответ, пожалуйста ... – Vinz243
Не указывайте свойства прототипа объекта. Чтобы преобразовать функцию в Promise, все, что вам нужно сделать, это вызвать на ней 'nfbind'. –