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

发布于 2022-09-05 09:34:29 字数 340 浏览 12 评论 0

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这个方法 想这样调用需要怎么做?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

山川志 2022-09-12 09:34:29

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

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

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

或者是异步队列的原因。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的是数值,字符,就不会有这个坑。

高跟鞋的旋律 2022-09-12 09:34:29

使用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);
     }

  }))

}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文