我正在尝试制作一个小的效用函数toPromise
,它将使用回调的函数转换为一个Promise函数(使用Q)。
这是实用程序:
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
中传递第三个arg(在utils中)该函数呢? 最佳答案
arguments
对象不是真正的数组:
>>> function getArguments() { return arguments; }
>>> var a = getArguments(1,2,3), b = [1,2,3];
>>> a[3] = 4; b[3] = 4;
>>> a
[1, 2, 3]
>>> b
[1, 2, 3, 4]
>>> a.length
3
>>> b.length
4
因此,如果您打算对其进行修改或将其传递给函数外部,则最好将其转换为真实数组:
var args = Array.prototype.slice.call(arguments);
关于javascript - 在javascript中套用参数无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23156796/