Angular: 延迟变量在 then-method 中未定义
Angular: deferred var is undefined in then-method
在我的 Angular.JS 代码中,我用 GET/JSONP 调用 Yahoo YQL API,我确实得到了响应。但是有两个问题。
- 它调用错误方法而不是成功方法。为什么?
- 延迟变量似乎在错误函数中未定义。为什么?
您可以找到 JsFiddle here. It is based on an AJAX example.
function DefaultCtrl($log, $scope, $http, myService) {
var promise = myService.getSuggestions('yahoo');
promise.then(
function(payload) {
$log.info('receiving data', payload);
$scope.test = payload;
$log.info('received data', payload);
},
function(errorPayload) {
$log.error('failure loading suggestions', errorPayload);
});
}
angular.module('MyModule', [])
.factory('myService', function ($http, $log, $q) {
return {
getSuggestions: function (symbol) {
var deferred = $q.defer();
$http.jsonp("http://d.yimg.com/autoc.finance.yahoo.com/autoc", {
cache: true,
params: {
callback: "YAHOO.Finance.SymbolSuggest.ssCallback",
query: symbol
}
})
.success(function(data) {
deferred.resolve(data);
})
.error(function(msg, code) {
$log.error("error");
deferred.reject(msg); // <---- error occurs here!
$log.error(msg, code);
});
var YAHOO = window.YAHOO = {Finance: {SymbolSuggest: {}}};
YAHOO.Finance.SymbolSuggest.ssCallback = function (data) {
$log.info("received data", data);
}; // YAHOO.Finance
return deferred.promise;
}
}
});
这是一个有效的 example。您必须在承诺回调中传递回调函数,然后让您的回调拒绝或解决承诺。
我认为您发布的代码的问题在于,在执行回调后 success
和 error
都被执行,结果未定义的 var 是 resolved/rejected.
var myApp = angular.module('MyModule', []);
myApp.controller('DefaultCtrl', function ($log, $scope, $http, myService) {
var promise = myService.getSuggestions('yahoo');
promise.then(
function (payload) {
$log.info('receiving data in DefaultCtrl', payload);
$scope.test = payload;
},
function (errorPayload) {
$log.error('failure loading suggestions', errorPayload);
});
});
myApp.factory('myService', function ($http, $log, $q) {
return {
getSuggestions: function (symbol) {
var YAHOO = window.YAHOO = {
Finance: {
SymbolSuggest: {}
}
};
YAHOO.Finance.SymbolSuggest.ssCallback = function (data) {
$log.info("received data in ssCallback", data);
deferred.resolve(data);
}; // YAHOO.Finance
var deferred = $q.defer();
$http.jsonp("http://d.yimg.com/autoc.finance.yahoo.com/autoc", {
cache: true,
params: {
callback: "YAHOO.Finance.SymbolSuggest.ssCallback",
query: symbol
}
})
.then(YAHOO.Finance.SymbolSuggest.ssCallback);
return deferred.promise;
}
}
});
在我的 Angular.JS 代码中,我用 GET/JSONP 调用 Yahoo YQL API,我确实得到了响应。但是有两个问题。
- 它调用错误方法而不是成功方法。为什么?
- 延迟变量似乎在错误函数中未定义。为什么?
您可以找到 JsFiddle here. It is based on an AJAX example.
function DefaultCtrl($log, $scope, $http, myService) {
var promise = myService.getSuggestions('yahoo');
promise.then(
function(payload) {
$log.info('receiving data', payload);
$scope.test = payload;
$log.info('received data', payload);
},
function(errorPayload) {
$log.error('failure loading suggestions', errorPayload);
});
}
angular.module('MyModule', [])
.factory('myService', function ($http, $log, $q) {
return {
getSuggestions: function (symbol) {
var deferred = $q.defer();
$http.jsonp("http://d.yimg.com/autoc.finance.yahoo.com/autoc", {
cache: true,
params: {
callback: "YAHOO.Finance.SymbolSuggest.ssCallback",
query: symbol
}
})
.success(function(data) {
deferred.resolve(data);
})
.error(function(msg, code) {
$log.error("error");
deferred.reject(msg); // <---- error occurs here!
$log.error(msg, code);
});
var YAHOO = window.YAHOO = {Finance: {SymbolSuggest: {}}};
YAHOO.Finance.SymbolSuggest.ssCallback = function (data) {
$log.info("received data", data);
}; // YAHOO.Finance
return deferred.promise;
}
}
});
这是一个有效的 example。您必须在承诺回调中传递回调函数,然后让您的回调拒绝或解决承诺。
我认为您发布的代码的问题在于,在执行回调后 success
和 error
都被执行,结果未定义的 var 是 resolved/rejected.
var myApp = angular.module('MyModule', []);
myApp.controller('DefaultCtrl', function ($log, $scope, $http, myService) {
var promise = myService.getSuggestions('yahoo');
promise.then(
function (payload) {
$log.info('receiving data in DefaultCtrl', payload);
$scope.test = payload;
},
function (errorPayload) {
$log.error('failure loading suggestions', errorPayload);
});
});
myApp.factory('myService', function ($http, $log, $q) {
return {
getSuggestions: function (symbol) {
var YAHOO = window.YAHOO = {
Finance: {
SymbolSuggest: {}
}
};
YAHOO.Finance.SymbolSuggest.ssCallback = function (data) {
$log.info("received data in ssCallback", data);
deferred.resolve(data);
}; // YAHOO.Finance
var deferred = $q.defer();
$http.jsonp("http://d.yimg.com/autoc.finance.yahoo.com/autoc", {
cache: true,
params: {
callback: "YAHOO.Finance.SymbolSuggest.ssCallback",
query: symbol
}
})
.then(YAHOO.Finance.SymbolSuggest.ssCallback);
return deferred.promise;
}
}
});