如何在promise .then()中调用object的方法?

时间:2016-05-23 15:25:34

标签: javascript promise

我有一个js对象,我有一个方法调用另一个方法并返回一个promise,但是从.then()内部我无法访问成员函数foo()。为什么我不能访问foo()以及如何访问它?这是我的代码:

function LoadImageGroupFormat() {
    return new Promise(function(resolve, reject) {
      var xhttp = new XMLHttpRequest();
      xhttp.open('GET', "imagegroup_format.txt");
      xhttp.onload = function() {
        if (xhttp.status == 200) resolve(xhttp.responseText);
        else reject(Error(xhttp.statusText));
      };
      xhttp.onerror = function() {
        reject(Error("Network Error"));
      };
      xhttp.send();
    });
  }
  //the object
var Registerhandler = {
  imageGroupIndex: 0,

  foo: function() {
    //Do something else here
  },

  GetImageGroupFormat: function() {
    var imageGroupIndex = this.imageGroupIndex;
    LoadImageGroupFormat().then(function(ImageGroup_Format) {
      //Do something with ImageGroup_Format
      imageGroupIndex++; //This works
      foo(); //Doesn't work - undefined
    }, function(error) {
      console.error("Failed to Load ImageGroup Format", error);
    });
  }
}

感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:1)

foo是一个属性,而不是函数/变量名,您需要使用属性语法来调用它。由于this没有保存在闭包中,因此您需要定义一个本地闭包变量来保存它。

您还需要使用self.imageGroupIndex来更新该属性,否则您需要递增该值的副本。

var Registerhandler = {
  imageGroupIndex: 0,

  foo: function() {
    //Do something else here
  },

  GetImageGroupFormat: function() {
    var self = this;
    LoadImageGroupFormat().then(function(ImageGroup_Format) {
      //Do something with ImageGroup_Format
      self.imageGroupIndex++;
      self.foo();
    }, function(error) {
      console.error("Failed to Load ImageGroup Format", error);
    });
  }
}

答案 1 :(得分:1)

使用Function.prototype.bind() bind()方法会创建一个新功能,在调用时,将 this 关键字设置为提供的值,在调用新函数时,在任何提供的参数序列之前使用给定的参数序列。

function LoadImageGroupFormat() {
  return new Promise(function(resolve, reject) {
    resolve('success!'); //updated fro demonstration purpose
  });
}
var Registerhandler = {
  imageGroupIndex: 0,
  foo: function() {
    alert('In foo!');
  },

  GetImageGroupFormat: function() {
    var imageGroupIndex = this.imageGroupIndex;
    LoadImageGroupFormat().then(function(ImageGroup_Format) {
      console.log(ImageGroup_Format);
      this.imageGroupIndex++;
      this.foo();
    }.bind(this), function(error) {
      console.error("Failed to Load ImageGroup Format", error);
    });
  }
}
Registerhandler.GetImageGroupFormat();