Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用对象方法作为回调来修改javascript中的对象属性_Javascript_Node.js_Asynchronous_Callback_Request - Fatal编程技术网

如何使用对象方法作为回调来修改javascript中的对象属性

如何使用对象方法作为回调来修改javascript中的对象属性,javascript,node.js,asynchronous,callback,request,Javascript,Node.js,Asynchronous,Callback,Request,我正在构建一个RESTAPI接口,在使用javascript模块的过程中,我发现尝试从回调返回值时遇到了问题。请求不能以这种方式工作,您必须在回调中处理数据 但是我需要处理和比较来自许多请求的数据,所以我决定将数据从回调中推送到某个数据库对象 我制作了一个原型函数作为回调函数来调用,以保持数据结构的模块化 我很困惑,因为当我试图在回调函数中修改this.value时,结果并没有到达正确的位置 我希望回调函数修改我的数据库实例,并在等待回调完成后能够访问该更改。 在下面的代码示例中,我向您展示了我

我正在构建一个RESTAPI接口,在使用javascript模块的过程中,我发现尝试从回调返回值时遇到了问题。请求不能以这种方式工作,您必须在回调中处理数据

但是我需要处理和比较来自许多请求的数据,所以我决定将数据从回调中推送到某个数据库对象

我制作了一个原型函数作为回调函数来调用,以保持数据结构的模块化

我很困惑,因为当我试图在回调函数中修改this.value时,结果并没有到达正确的位置

我希望回调函数修改我的数据库实例,并在等待回调完成后能够访问该更改。
在下面的代码示例中,我向您展示了我能够使用globalString完全做到这一点,但在globalDatabase中,赋值在回调函数结束后不会继续存在

我怀疑我可能错误地使用了对象指针。谁能指出我如何修改this.value的缺陷,或者提供一个很好的替代我在这里使用OOP的方法

一个好的解决方案应该能够从回调内部分配一个值,然后从回调未调用的另一个函数访问该值

存储回调数据的最佳方式是什么

    var Database = function(){
        console.log("<Executing constructor>");
        this.value = "initial constructor data";
    };
    Database.prototype.myCallback = function(error, response, body){
        console.log("<Executing callback>");
        this.value = body;
        globalString = body;
    };
    globalString = "blank";
    globalDatabase = new Database();
    console.log(globalString, "|" ,globalDatabase.value);
    main();
    function main(){
        var request = require('request');
        requestParams = {
            url: "http://ip.jsontest.com/",
            method: "GET",
            json: true
        };
        request(requestParams, globalDatabase.myCallback);
        console.log(globalString, "|" ,globalDatabase.value);
        setTimeout(function() {
            console.log(globalString, "|" ,globalDatabase.value);
        }, 2 * 1000);//seconds wait time for callback to finish
    };
var数据库=函数(){
控制台日志(“”);
this.value=“初始构造函数数据”;
};
Database.prototype.myCallback=函数(错误、响应、正文){
控制台日志(“”);
这个值=身体;
globalString=主体;
};
globalString=“blank”;
globalDatabase=新数据库();
log(globalString,“|”,globalDatabase.value);
main();
函数main(){
var请求=要求(“请求”);
requestParams={
url:“http://ip.jsontest.com/",
方法:“获取”,
json:true
};
请求(requestParams,globalDatabase.myCallback);
log(globalString,“|”,globalDatabase.value);
setTimeout(函数(){
log(globalString,“|”,globalDatabase.value);
},2*1000);//等待回调完成的秒数
};
我能够在setTimeout中使用回调来复制这个问题

var数据库=函数(){
控制台日志(“”);
this.value=“初始构造函数数据”;
};
Database.prototype.myCallback=函数(){
控制台日志(“”);
this.value=“回调修改数据”;
};
d=新数据库()//异步修改的全局目标
main();
函数main(){
log(“首先,对象包含:”,d.value);
setTimeout(d.myCallback,1*1000);//秒等待时间
log(“返回main,对象包含:”,d.value);
setTimeout(函数(){
log(“耐心等待后,对象包含:”,d.value);
},2*1000);//秒等待时间
};这是Javascript的一个众所周知的“怪癖”:当您从
request
函数(或从
setTimeout
)调用
myCallback
函数时,调用的上下文是
request
函数-这意味着
This
请求
到您的
数据库
对象。因此,例如,如果从DOM事件处理程序调用
myCallback
,则
将引用DOM元素

有很多很好的答案可以解释这一点:或者

现在,为了解决您的特定问题,这里有一个代码示例。我冒昧地用ES6类重写了您的第二个示例,因为我认为这样更清楚:

类数据库{
构造函数(){
控制台日志(“”);
this.value='初始构造函数数据';
//将'this'绑定到'myCallback'函数,以便无论何时调用
//'myCallback`,它将始终具有正确的'this'`
// 
this.myCallback=this.myCallback.bind(this);
}
myCallback(){
控制台日志(“”);
this.value='callback modified data';
}
}
设d=新数据库()//异步修改的全局目标
main();
函数main(){
log(“首先,对象包含:”,d.value);
setTimeout(d.myCallback,1*1000);//秒等待时间
log(“返回main,对象包含:”,d.value);
setTimeout(函数(){
log(“耐心等待后,对象包含:”,d.value);
},2*1000);//秒等待时间
};这是Javascript的一个众所周知的“怪癖”:当您从
request
函数(或从
setTimeout
)调用
myCallback
函数时,调用的上下文是
request
函数-这意味着
This
请求
到您的
数据库
对象。因此,例如,如果从DOM事件处理程序调用
myCallback
,则
将引用DOM元素

有很多很好的答案可以解释这一点:或者

现在,为了解决您的特定问题,这里有一个代码示例。我冒昧地用ES6类重写了您的第二个示例,因为我认为这样更清楚:

类数据库{
构造函数(){
控制台日志(“”);
this.value='初始构造函数数据';
//将'this'绑定到'myCallback'函数,以便无论何时调用
//'myCallback`,它将始终具有正确的'this'`
// 
this.myCallback=this.myCallback.bind(this);
}
myCallback(){
控制台日志(“”);
this.value='callback modified data';
}
}
设d=新数据库()//异步修改的全局目标
main();
函数main(){
log(“首先,对象包含:”,d.value);
setTimeout(d.myCallback,1*1000);//秒