如何通过异步xmlhttprequest响应设置变量
How to set a variable via asynched xmlhttprequest response
如果我发出同步请求,我试图实现的目标可以很容易地完成,但由于它已被弃用,我现在正在更新我的脚本,以正确使用异步调用,这样当其他方法停止工作时,脚本就可以继续工作。
我目前使用的代码如下:
function GET(a) {
var request = new XMLHttpRequest(),
data;
request.open("GET", a, false);
request.onreadystatechange = function () {
if(4 == request.readyState) data = request.responseText;
};
request.send();
return data;
}
function getObject(a) {
var constructor = {};
constructor.property1 = 'something1';
constructor.property2 = 'something2';
constructor.property3 = 'something3';
constructor.property4 = true;
if(a && a.attribute === null) constructor.property5 = GET('/url-location');
return constructor;
}
var object = getObject(a);
if(object.property5) doSomethingWith(object);
正如您所看到的,请求是在运行时执行的,目的是为构造函数对象设置一个值。它之所以有效,是因为它是同步的,并且函数在继续之前等待响应,从而允许在返回对象之前设置一个值。
然而,当请求异步运行时,情况不会发生同样的情况,因为函数在不等待响应的情况下继续运行。
我的问题很明显;是否可以用异步请求复制相同的行为?如果没有,那么我怎么能在不做太多修改的情况下实现同样的结构呢?我的意思是,构造函数对象的创建需要以我所呈现的方式来创建;调用getObject后按顺序设置多个属性,并在完成时返回。
我不能使用库,所以没有jQuery、Node等。我也在避免定时/循环函数。
还有一个我几乎忘记的细节:GET函数被另一个结构不同但目标相似的函数使用,所以这并不像更改GET函数以仅使用我提供的示例那么简单。
将回调函数传递到GET
中,并调用它:
function GET(a, callback) { // <== Change here
var request = new XMLHttpRequest(); // <== No need for `data`
request.open("GET", a, true);
request.onreadystatechange = function () {
if(4 == request.readyState) callback(request.responseText); // <== Change here
};
request.send();
}
用法(还有回调,我没有调用更改,它们就像上面一样):
function getObject(a, callback) {
var constructor = {};
constructor.property1 = 'something1';
constructor.property2 = 'something2';
constructor.property3 = 'something3';
constructor.property4 = true;
if(a && a.attribute === null) GET('/url-location', function(data) {
constructor.property5 = data;
callback(constructor);
});
}
用法:
getObject(a, doSomethingWith);
或者,如果你真的需要object
变量:
var object;
getObject(a, function(data) {
object = data;
doSomethingWith(object);
});
但是注意object
将是undefined
直到回调发生(例如直到XHR调用完成)。
另一种方式是承诺,但它仍然涉及回调,只是一种不同的(可以说更强大/更方便的)链接方式。
相关文章:
- 如何在定义js文件后为外部javascript文件设置变量
- 在 Jquery/Javascript 中使用多个 OR (||) 运算符时如何设置变量
- 在值内设置变量
- 在javascript函数中设置变量
- 设置变量时破坏游戏代码
- 未设置变量的赋值| jQuery的作用是什么
- 在可编辑行内设置变量
- 在不中断形式帖子的情况下在角度中设置变量
- MongoDB MonkAPI根据数据库请求之外可用的查找结果设置变量
- text方法中的javascript设置变量
- 如何为JavaScript函数设置变量以嵌入视频
- 使用jQuery和PHP加载区域设置变量
- 包括外部JS文件和设置变量
- 在jQuery File upload插件中设置变量上传路径
- 设置变量函数不起作用
- Session.get未在Meteor.js中设置变量
- 为cytoscape.js mapData设置变量限制
- 如何在脚本标记中设置变量
- 使用控制器在conditional.js.erb文件中设置变量
- 如何从控制台动态设置变量