创建一个没有返回值的AngularJS promise。

8
我正在使用$q来将一个遗留的回调函数包装成一个 Promise。然而,现有的回调函数没有返回值,它需要一个没有参数的成功函数。
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文档中找不到resolvevoid版本。我可以返回一个虚拟值,但是客户端可能会访问该虚拟值,这会导致混淆。
如何创建没有返回值的AngularJS promise?
注意:问题AngularJS promise returning empty object完全不同。那个问题在resolve函数中返回一个值。

只需使用 deferred.resolve() 解决即可吗? - PSL
@PSL 这是可能的吗?文档中没有提到。 - metacubed
1
是的,你可以解决没有价值的问题。试一试,看看会发生什么.. :) http://plnkr.co/edit/BpYqlg?p=preview - PSL
我一直在使用deferred.resolve() - Reactgular
@MathewFoscarini 是的,但这是未记录的行为,可能会改变吗?有没有文档提到这个行为? - metacubed
2
认真点,各位。不要给这个问题投反对票。对于那些从有类型语言转到JavaScript的新手来说,这是一个完全有效的问题。 - Reactgular
1个回答

13

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 promise?"

要编写表达无返回值意图的 JavaScript 代码以创建 promise,您可以编写以下内容。

deferred.resolve(undefined);

这表明没有预期的数据。

在回调函数中,您后续不必定义data参数,但如果需要的话可以定义。

 foo().then(function(data){
     if(typeof data === 'undefined') {
          // there is no data
     } else {
          // there is data
     });

如果您一直期望没有数据,那么只需这样做。

foo().then(function(){
   // handle success
});

很好,详细的回答!我原本以为 undefined 的 false-y 行为会影响 promise 的内部比较算法 :) - metacubed
@metacubed 是的,但 Angular 的 Promise 代码并没有触及传递给回调函数的数据值。在源代码中,你可以看到 value 只是按原样传递。https://github.com/angular/angular.js/blob/master/src/ng/q.js#L447 - Reactgular

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接