http.jsonp 和 JavaScript 中的回调
http.jsonp and callbacks in javascript
我正在研究一个计算器,该计算器将考虑AWS实例成本。我正在从亚马逊上的.js文件中提取数据,我想将其读取到对象中,但不断收到错误"未捕获的引用错误:未定义回调"..这是我.js文件。
(function() {
var app = angular.module('formExample', []);
var ExampleController = function($scope, $http) {
$scope.master = {};
$scope.update = function(user) {
$scope.master = angular.copy(user);
$scope.GetAws();
};
$scope.reset = function() {
$scope.user = "";
};
function callback(data) {
$scope.aws = data;
}
$scope.GetAws = function() {
var url = "http://a0.awsstatic.com/pricing/1/ec2/linux-od.min.js?callback=callback";
$http.jsonp(url);
};
$scope.reset();
};
app.controller('ExampleController', ['$scope', '$http', ExampleController]);
}());
奇怪的是,您使用的 aws 链接支持 jsonp,但它不接受自定义回调函数名称。(至少您可以查找以了解他们正在寻找的查询字符串是否callback
)。当我们提供callback=JSON_CALLBACK
时,Angular 会处理它,它会被转换为由 angular 临时全局公开的angular.callbacks_x
来处理请求并相应地解决承诺。但为此,端点必须采用回调参数并将响应包装在相同的字符串和函数调用中。但是,此端点似乎没有考虑它,即使没有任何回调,它也会自动包装为默认的callback
函数调用。因此,您需要注入$window
(正确的DI方式)对象并为其设置callback
功能,?callback=callback
无关紧要。
var ExampleController = function($scope, $http, $window) {
$scope.master = {};
//....
$window.callback = function(data) {
$scope.aws = data;
}
$scope.GetAws = function() {
var url = "http://a0.awsstatic.com/pricing/1/ec2/linux-od.min.js?callback=callback";
$http.jsonp(url);
};
$scope.reset();
};
app.controller('ExampleController', ['$scope', '$http', '$window', ExampleController]);
普罗提
这是因为AWS脚本希望在全局范围内(Angular之外)调用一个名为"callback"的函数。由于您的函数在另一个 (IIFE) 函数的范围内,因此无法访问它。
在这种情况下,我所做的只是将函数放在全局范围内。
如果应用程序需要加载一些 API,然后 Angular 才能发挥它的魔力,并且具有类似于您的情况的回调,我已经完成了以下操作,手动引导 Angular:
索引.html
<script src="http://www.example.com/api?callback=myCallbackFunction"></script>
应用.js
// callback function, in global (window) scope
function myCallbackFunction() {
// manually bootstrap Angular
angular.element(document).ready(function() {
angular.bootstrap(document, ['myApp']);
});
}
// your IIFE
(function() {
})();
注意callback
应该设置在window
范围内。因此,一种解决方案如下:
$scope.reset = function() {
$scope.user = "";
};
window.callback = function(data) {
$scope.aws = data;
}
$scope.GetAws = function() {
var url = "http://a0.awsstatic.com/pricing/1/ec2/linux-od.min.js?callback=callback";
$http.jsonp(url);
};
相关文章:
- 如何将一个JavaScript函数回调为多个函数
- JavaScript回调函数
- 用于回调的javascript参数
- Soundcloud Javascript SDK 3.0-回调无法读取属性'connectCallback
- Javascript点击事件回调不起作用
- 如何让程序员在javascript中实现正确的回调
- 从多个回调 javaScript 返回最终对象
- 如何使用传递参数回调 JavaScript 对象属性
- 可能从其他域弹出时回调 JavaScript
- 一个函数,它接受回调并创建只能调用一次的新版本的回调.Javascript
- 构造Javascript回调:Javascript/JQuery
- 对象成员函数的回调?(Javascript)
- 回调javascript动画
- 如何将自定义回调javascript参数添加到bing API回调中
- Facebook喜欢按钮回调javascript警告框
- 在Yii2中表单验证后的回调Javascript函数
- ASP.Net ThreadPool委托回调——JavaScript不会在回调线程上触发
- 其他函数中的回调 javascript 函数
- robot -递归回调- JavaScript
- 更好的回调Javascript代码在Express/NodeJs