如何创建包含异步调用的Javascript(es5)构造函数

脚本作者

我正在尝试创建一个构造函数,该函数包含对indexedDB或localStorage的调用,以检索某些数据(如果存在),然后从缓存或给定(默认)数据填充其值。

我有它的工作,但以某种方式破坏了我的代码。鉴于我的编程方法是“用棍子砸它直到起作用”,该代码绝对是一团糟。因此,我将问题简化为一个人为的示例,该示例以相同的方式失败。

删除异步函数(setTimeout)可以解决此问题,但是我的代码将无法工作。

var person = (function(){
    function privateFn (value){
        return value;
    }
    function private_asyncFn(value, callback){
        setTimeout(function () {
            return callback(value);
        }, 10);
    }
    var DATA, NUM;
    var personConstructor = function(name, age, gender, callback){
        this.name = privateFn(name);
        this.gender = privateFn(gender);
        DATA = DATA || [];
        NUM = NUM || 0;
        this.num = NUM;
        private_asyncFn(age, function(ret){
            DATA[NUM++] = { name: this.name, age: ret };
            if (callback instanceof Function) return callback(this.name);
        }.bind(this));
    };
    personConstructor.prototype.getAge = function () {
        if (this.gender === "male") return DATA[this.num].age;
        else return DATA[this.num].age < 20 ? 18 : (Math.floor(DATA[this.num].age / 10) - 1) + "9 and holding";
    };
    return personConstructor;
})();

var name1;
var person1 = new person("jill", 32, "female", function(name){
    name1 = name;
});
var age1 = person1.getAge(); //Uncaught TypeError: Cannot read property 'age' of undefined????

我在SO上使用类和Promise以及async / await看到了其他代码,但是我不知道它们是如何工作的,所以这段代码有点“老派”,对此感到抱歉。

在此示例中,您可以在初始化新人员之后立即检索该人员的年龄吗?

脚本作者

通过将所有异步逻辑移动到init创建a之后调用函数,new person可以使构造函数保持同步。然后getAge可以init使用this.getAge()回调函数内部进行调用person1.getAge()(因为person1现在存在)

var person = (function(){

    function privateFn (value){
        return value;
    }

    function private_asyncFn(value, callback){
        setTimeout(function () {
            return callback(value);
        }, 10);
    }

    var DATA, NUM;

    //removed all data inputs and callback from constructor function
    var personConstructor = function(){

        //initialise publically accessible data    
        this.name = null;
        this.gender = null;

        //initialise blank data store
        DATA = DATA || [];
        NUM = NUM || 0;
        this.num = NUM;
        DATA[NUM++] = { 
            age: null
        };
    };

    //created new init function
    personConstructor.prototype.init = function (name, age, gender, callback){

        this.name = privateFn(name);
        this.gender = privateFn(gender);

        private_asyncFn(age, function(ret){

            DATA[this.num].age = ret;

            //note: .call(this,...) on the callback to use "this" in the callback
            if (callback instanceof Function) return callback.call(this, this.name);

        }.bind(this));
    };

    personConstructor.prototype.getAge = function () {
        if (this.gender === "male") return DATA[this.num].age;
        else return DATA[this.num].age < 20 ? 18 : (Math.floor(DATA[this.num].age / 10) - 1) + "9 and holding";
    };

    return personConstructor;
})();

var name1, age1;
var person1 = new person();
person1.init("jill", 32, "female", function(name){
    name1 = name;
    age1 = this.getAge();
    console.log(age1);//29 and holding, YES!
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何构造对 API 的异步调用?

来自分类Dev

如何异步调用AWS Lambda函数

来自分类Dev

如何异步调用AWS Lambda函数

来自分类Dev

在页面构造函数中异步调用Web服务

来自分类Dev

类构造函数中的Winjs异步调用

来自分类Dev

异步调用模板函数

来自分类Dev

试图在javascript中异步调用函数(使用angularjs)

来自分类Dev

如何从构造函数调用异步方法?

来自分类Dev

V8 JavaScript如何进行异步调用

来自分类Dev

如何在Flutter中异步调用JavaScript?

来自分类Dev

HTML5 / Javascript GeoLocation:将数据传递给回调函数-或-暂停异步调用(带有Promise)?

来自分类Dev

Knockout计算函数内部的异步调用

来自分类Dev

lua同步调用C异步函数

来自分类Dev

在OCaml中异步调用函数

来自分类Dev

异步调用的函数语法

来自分类Dev

lua同步调用C异步函数

来自分类Dev

PHP 异步调用多个函数

来自分类Dev

异步调用函数的 NodeJs 错误

来自分类Dev

NodeJS:在对象中创建条件属性的方法比自调用函数更短?(ES5 或 ES6)

来自分类Dev

循环中的所有异步调用完成后,如何调用函数?

来自分类Dev

仅当来自服务的异步调用完成时,如何调用函数?

来自分类Dev

如何异步调用任何 c# 代码(函数、Web 参考、API 调用)?

来自分类Dev

异步调用后,JavaScript ES6调用为“ super”

来自分类Dev

从构造函数调用的异步方法

来自分类Dev

如何异步调用WCF服务

来自分类Dev

如何从celery任务异步调用url

来自分类Dev

如何同步调用异步(等待)方法?

来自分类Dev

如何同步调用异步(等待)方法?

来自分类Dev

如何获得异步调用的结果?

Related 相关文章

热门标签

归档