javascript - 在 javascript 中应用参数不起作用

标签 javascript promise

我正在尝试制作一个小型实用函数 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

那么为什么第三个参数(在 utils 中),函数,没有在 apply 中传递?

最佳答案

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/

相关文章:

javascript - 等待相当于 'Promise.resolve().then()' ?

javascript - react 路由器不在服务器上重定向

Javascript 触摸库仍然允许桌面事件工作

javascript - 更改单个文件时,Visual Studio 2015 会编译所有 typescript 文件

javascript - Rx.js 与 Promise 的并发

javascript - 仅当 Promise 解析时才使用 JS Array.push

node.js - 在nodejs中将异步代码转换为q/promise代码

javascript - 用于计算以下字符串的正则表达式

javascript - 如何通过非立即的类获取父元素的ID值? jQuery

javascript - 如何在嵌套 promise 中传播resolve()?