javascrip 异步操作之后返回新对象

function test() {
  $.ajax({
     url:xxx,
     type:'GET',
     success:function(data) {
       data:data;
       function employee(data) {
         this.customer = function(){console.log(data)}
       }
       return new employee(data);
     }

  })

}
var p = new test()
p.customer()//没有找到employee这个方法 想这样调用需要怎么做?
阅读 3k
3 个回答

你这个问题有3个问题
1.异步操作后返回结果
2.return返回的其实是success函数,并不是test
3.var p = new test()
前面两个都是undefined的原因
解决办法:

一、 1.使用promise 或者async/await      2.ajax变同步 async:false
二、 在上一步的基础上把return放在test
三、 这里不用再new了,因为return的时候已经构造了。

打完答案,发现答非所问了?

或者是异步队列的原因。ajax还在异步中时,代码`var p = new test()`其实已经执行完毕,导致,p这个对象,都是undefine。

原答案:


看过jQuery源码的可能知道这个东西:

return new jQuery.fn.init();

题主问题,其实和下面代码是类似的。

function B(){
    this.c = 3;
    this.d = 4;
}
function test(){
    this.a = 1;
    this.b = 2;
    return new B()
}

var newTest = new test();
newTest.a // undefined
newTest.b // undefined
newTest.c // 3
newTest.d // 4

(吐槽一下这个在某些书上没法找到坑)
不论你调用var newTest = test() 或是 var newTest = new test() 结果中,.a .b都是undefined
其槽点,就是return,存在return语句,且return 一个对象时 ,这个新return的对象的作用域,会取代之前代码生成的对象。但是如果return的是数值,字符,就不会有这个坑。

使用Promise.resolve(),代码如下:

function test() {
Promise.resolve(
  $.ajax({
     url:xxx,
     type:'GET',
     success:function(data) {
       data:data;
       function employee(data) {
         this.customer = function(){console.log(data)}
       }
       return new employee(data);
     }

  }))

}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题