我正在使用$q
来包围传统回调的承诺。但是,现有回调没有返回值。它需要一个没有参数的成功函数。
angular.module('MyModule').service('MyService', function() {
function initialize() {
var deferred = $q.defer();
LegacyFactory.initialize(
// 'void' Success Callback
function () {
deferred.resolve (/* WHAT DO I PUT HERE? */);
},
// Error Callback
function (errorCode) {
deferred.reject(errorCode);
});
return deferred.promise;
}
});
我在AngularJS文档中找不到void
resolve
版本的resolve
。我可以返回一个虚拟值,但是客户端可能会访问该虚拟值,这会导致混淆。
如何创建没有返回值的AngularJS承诺?
注意:问题AngularJS promise returning empty object完全不同。该问题确实会在{{1}}函数中返回一个值。
答案 0 :(得分:12)
JavaScript中没有void
数据类型。相反,JavaScript使用原始类型undefined
,用于表示尚未赋值的变量。
没有返回值的方法或语句将返回undefined
。不使用return
语句的函数将返回undefined
。未传递给函数的参数将为undefined
。
我希望你们开始在undefined
看到一致的行为。
function foo(x) { console.log(x); }
foo(); // will print undefined
function zoom() {}
console.log(zoom()); // will print undefined
因此,当您使用deferred.resolve()
时,您将传递undefined
作为数据参数的值。
更具体地回答你的问题。
“如何创建没有返回值的AngularJS承诺?”
编写JavaScript代码,赋予promise无返回值的意图。你会写这个。
deferred.resolve(undefined);
这表明没有预期的数据。
稍后在回调中,您不必定义数据参数,但如果您愿意,可以。
foo().then(function(data){
if(typeof data === 'undefined') {
// there is no data
} else {
// there is data
});
如果您总是期望没有数据,那么就这样做。
foo().then(function(){
// handle success
});