Promise + 数组中未定义 'this'。减少()

Undefined 'this' in Promise + array. reduce()

我从今天早上开始就遇到了一个问题。

我有什么

基本上,我有一个简单的 class,其中包含一组要注册的文件:

function MyClass() {

    this.filesToRegister = [
        {
            "fileName": "http://tny.im/azk"
        },
        {
            "fileName": "http://tny.im/azk"
        }
    ];
}

我还有一个简单的函数,_contextFunction() 需要一个 fileToRegister 条目:

MyClass.prototype._contextFunction = function(fileToRegister) {

    return new Promise((resolve, reject) => {

        logger.info(typeof this.filesToRegister);
        logger.info('current file: ' + fileToRegister);
        return resolve();
    });
};

请注意,此函数必须访问上下文(this),这是强制性的,我无法更改它。

最后,我有一个实用方法,processArray(),它可以对数组的每一项应用一个函数,全部同步完成:

MyClass.prototype.processArray = function(array, fn) {

    let results = [];
    return array.reduce((p, item) => {

        return p.then(() => {

            return fn(item).then((data) => {

                results.push(data);
                return results;
            }).catch(err => console.log(err));
        });
    }, Promise.resolve());
};

我想做什么

我使用此实用程序方法将 _contextFunction() 应用于 filesToRegister 数组的每个项目:

this.processArray(this.filesToRegister, this._contextFunction);

它可以正常工作并在 this.filesToRegister 的每个项目上执行 this._contextFunction()

问题是什么

但是,当我尝试在 _contextFunction() 中记录 typeof this.filesToRegister 时,结果是 undefined... 经过多次测试,我得出结论,上下文中的任何内容都不可访问(既上下文属性或上下文方法)。

但是,如果我在没有 processArray() 方法的情况下执行 this._contextFunction(),我可以访问上下文(上下文属性和上下文方法)。

我的想法

我的猜测是问题出在 processArray() 方法上,但我看不出哪里...我试图在 processArray() 方法中记录 typeof this.filesToRegister,并且有效...

总结:

谁能帮帮我?谢谢

fn(item)

在没有上下文的情况下调用函数。使用:

fn.call(this, item)

或者传递方法名称:

this.processArray(this.filesToRegister,"_contextFunction");

然后做:

this[fn](item);

我会怎么做:

class MyClass {
 constructor(){
   this.files = [];
 }
 async add(file){
   await "whatever";
   this.files.push(file);
 }
 multiple(name, array){
   return Promise.all( array.map(el => this[name](el)));
 }
}

然后:

const instance = new MyClass;
instance.add("whatever");
instance.multiple("add",[1,2,3]);