$q.reject 和 $state.resolve 没有按预期工作

$q.reject and $state.resolve not working as expected

我有这个功能:

// Gets our sport
get: function (slug, kit) {

    // If we have no slug, exit the function
    if (!slug)
        return $q.reject('No slug supplied.');

    // Try to get our sport
    return moltin.categories.get(slug).then(function (response) {

        // If we have a kit
        if (kit) {

            // Assign our sport to our kit
            kit.team.sport = response.slug;
        }

        // Return our response
        return response;
    });
}

如您所见,如果未设置所需参数,我将使用 $q.reject()。 问题是,在 $state 解析方法中,如果我这样调用函数:

resolve: {

    sport: ['$stateParams', 'kit', 'SimpleDesignerSharedSportService', function ($stateParmas, kit, sharedSport) {

        // Get our slug
        var slug = $stateParmas.sport || kit.team.sport;

        // Get our sport
        return sharedSport.get(slug, kit);
    }]
}

我的视图将不会显示(它只是空白)。但如果我改变我的决心:

resolve: {

    sport: ['$stateParams', 'kit', 'SimpleDesignerSharedSportService', function ($stateParmas, kit, sharedSport) {

        // Get our slug
        var slug = $stateParmas.sport || kit.team.sport;

        // Get our sport
        return sharedSport.get(slug, kit).then(function (response) {
            return response;
        }, function (error) {
            return null;
        });
    }],

    pageTitle: ['PageHead', function (service) {
        service.setTitle('Kudos Sports - Create your kit');
    }]
}

有效。我不想指定成功和失败方法。无论如何我可以绕过它吗?

解决需要一个承诺,以便它可以在加载页面之前解决它。您的代码中有一些问题我会帮助您识别和解决,但是我强烈建议您学习 this short course on Udacity 并温习一下您对 promises 的理解。

首先,一旦您的数据得到解析,我们需要将您的 get 方法重构为 return 承诺。

// Gets our sport
get: function (slug, kit) {
  var deferred = $q.defer();

  // If we have no slug, exit the function
  if (!slug)
    deferred.reject('No slug supplied.');

  // Try to get our sport
  moltin.categories.get(slug).then(function (response) {

    // If we have a kit
    if (kit) {

        // Assign our sport to our kit
        kit.team.sport = response.slug;
    }

    // Return our response
    deferred.resolve(response);
  });

  return deferred.promise;
}

如您所见,您不能只 return promise 中的数据。您必须创建另一个承诺,并且 return 一旦有数据。

下一步是在解析中使用此函数。您似乎使用了 $stateParmas 而不是 $stateParams,因此我们也更正了这一点。此外,在不同的地方以不同的方式命名您的服务也是不好的做法。与命名约定保持一致使调试更容易。

resolve: {

  sport: ['$stateParams', 'kit', 'SimpleDesignerSharedSportService', function ($stateParams, kit, SimpleDesignerSharedSportService) {

    // Get our slug
    var slug = $stateParams.sport || kit.team.sport;

    // Get our sport
    return SimpleDesignerSharedSportService.get(slug, kit);
  }]
}

现在 get 方法 return 是一个承诺,只有在获取类别有响应并且您再次控制数据流时才会解决。