使AJAX“get”函数同步/如何获得结果
Make AJAX "get" function synchronous / how to get the result?
我遇到了$.get函数的问题。网址包含 JSON
我的代码:
xyz = null
$.get('http://www.someurl.com/123=json', function(data) {
var xyz = data.positions[0].latitude;
});
alert(xyz);
//some more code using xyz variable
我知道xyz
会提醒空结果,因为$.get
是异步的。
那么有什么方法可以在此 get 函数之外使用xyz
呢?
get
是一个快捷方式。您可以使用以下方法执行相同的操作,但要同步执行:
var xyz = null
$.ajax({ url: 'http://www.someurl.com/123=json',
async: false,
dataType: 'json',
success: function(data) {
xyz = data.positions[0].latitude;
}
});
alert(xyz);
但是,您必须在 ajax 调用之前声明 xyz
变量。
真正的答案是否定的,但你可以使用它:
function useXYZ(){
alert(xyz);
}
xyz = null
$.get('http://www.someurl.com/123=json', function(data) {
xyz = data.positions[0].latitude;
useXYZ();
});
这是Javascript的常见问题。Javascript 代码必须以延续传递样式编写。它很烦人,但您可以不假思索地转换它。
基本上,每当我们有类似的东西
var x = someSyncFunction(a, b, c);
//do something with x
console.log(x);
我们可以将其转换为异步代码,方法是将函数返回后的所有代码转换为延续函数,并将 x 从变量转换为延续回调的参数。
someAsyncFunction(a, b, c, function(x){
//do something with x;
console.log(x);
});
你必须注意,编写令人困惑的代码非常容易。要记住的一个好技巧是,您可以使自己的函数也接收回调。这允许它们被不同的函数使用(就像返回值的普通同步帮助程序函数可以被不同的函数使用一样)
var getXyz = function(onResult){ //async functions that return do so via callbacks
//you can also another callback for errors (kind of analogous to throw)
$.get('http://www.someurl.com/123=json', function(data) {
var xyz = data.positions[0].latitude;
onResult(xyz); //instead of writing "return xyz", we pass x to the callback explicitely.
});
};
getXyz(function(xyz){ //this would look like "var xyz = getXyz();" if it were sync code instead.
console.log('got xyz');
});
这里的诀窍是将所有返回语句从函数更改为对回调函数的调用。想想好像异步函数从未返回过,将值返回给某人的唯一方法是将该值传递给回调。
你可能会问为什么没有更简单的方法来做这一切。好吧,没有,除非你使用另一种语言而不是Javascript(或者至少允许你以同步风格编写异步代码,但自动编译为常规Javascript)
相关文章:
- 什么'这是从第三个函数上的async 1st函数获得结果的更好方法
- 如何等待一个HTML页面并在页面复杂创建时获得结果
- 如何在ReactJS中同时调用多个ajax(并同步获得结果)
- 使AJAX“get”函数同步/如何获得结果
- 如何从嵌入式 Chromium 控件中执行 JavaScript 来获得结果
- 在页面之间传递变量,并在 asp.net 中基于它获得结果
- 添加小时数以获得结果的总小时数
- JavaScript在sha512中加密,并在原始二进制数据中获得结果,如PHP hash()
- Angular-多次承诺和迭代-如何获得结果
- onclick v no onclick;如何在不点击的情况下获得结果
- 如何在框架之外获得结果
- 如何用Javascript从submit.php获得结果
- 使用正则表达式查找模式并获得结果
- request-promise -我如何从函数外的Promise获得结果?
- Javascript在两个不同的函数中获得结果并将它们添加在一起
- 创建一个javascript msgbox (YES/NO)并在代码隐藏中获得结果
- 如何在Xamarin iOS项目中评估JavaScript并获得结果?
- Alfresco:外部web服务调用获取错误,无法获得结果
- 使用Angular迭代JSON并获得结果
- 如何使用Nodejs与R来获得结果