【问题标题】:Chaining function that returns promise doesn't resolve after flushing timeout刷新超时后返回承诺的链接函数无法解析
【发布时间】:2014-10-14 09:31:22
【问题描述】:

此测试代码中的链无法解析...它解析了级别 1 和级别 2。

    it('Three level promise', inject(function ($q, $timeout, $rootScope) {
        var plusOne = function(value) {
            var deferred = $q.defer();
            $timeout(function() {
                deferred.resolve(value+1);
            }, 10);
            return deferred.promise;
        }

        var promiseCall = function() {
            return plusOne(1).then(function (data){
                console.error('call1 resolved', data);
                return plusOne(data).then(function (data2){
                    console.error('call2 resolved', data2);
                    return plusOne(data2).then(function (data3){
                        console.error('call3 resolved', data3);
                            return data3;
                    });
                });
            });
        }

        var result;

        promiseCall().then(function (data) {
            result = data;
        });

        $timeout.flush(); // Force timeout to be flushed.

        expect(result).toBe(3);
    }));

我不明白为什么这不起作用... :-(

...而且stackoverflow 不喜欢我在这个请求中有这么多代码。

【问题讨论】:

  • 所以你永远不会得到call3 resolved日志或测试失败?
  • 为什么在成功处理程序中使用console.error(而不是console.log)?
  • 就目前而言,预计resultundefined。将expect() 移动到promiseCall().then(function(){...}) 中,并期望dataNaN (undefined + 1)。然后从各自的函数中返回datadata2 并期望data4 (1+1+1+1)。

标签: javascript angularjs promise angular-promise


【解决方案1】:

两个问题:

$timeout.flush(); 刷新第一个 $timeout 调用。目前还没有叫到另外两个。所以你必须拨打$timeout.flush(); 三次,而不是一次。

第二:预期的结果不是3,而是4。你从1开始,解析出来的值总是+1。你解决了三遍。

【讨论】:

    猜你喜欢
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 2017-05-11
    • 2018-09-16
    • 2022-11-10
    • 1970-01-01
    相关资源
    最近更新 更多