AngularJS 函数返回带有必需参数的承诺

AngularJS function returning promise with required parameter

简单的问题。 我已经构建了这个函数:

// Gets the kit by id or slug
var _getKit = function (id) {

    // Try to get our kit using our shared service
    return sharedKitService.get(id).then(function (response) {

        // Assign the response to our service
        service.models.kit = response;

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

我想在函数中添加一个检查,如下所示:

// Gets the kit by id or slug
var _getKit = function (id) {

    // If we have no id, exit the function
    if (!id)
        return;

    // Try to get our kit using our shared service
    return sharedKitService.get(id).then(function (response) {

        // Assign the response to our service
        service.models.kit = response;

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

但我知道这行不通,因为如果没有 id,函数将不再产生 promise。 我知道我可以做这样的事情:

// Gets the kit by id or slug
var _getKit = function (id) {

    // If we have no id
    if (!id) {

        // Defer our promise
        var deferred = $q.derfer();

        // Reject our promise
        deferred.reject();

        // Return our promise
        return deferred.promise;
    }

    // Try to get our kit using our shared service
    return sharedKitService.get(id).then(function (response) {

        // Assign the response to our service
        service.models.kit = response;

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

但这似乎有点矫枉过正。 有更简单的方法吗?

你可以简单地使用

$q.reject();

来自Angular docs

return $q.reject(reason)。 这个returns立即被拒绝的承诺

为了更简短的目的,您可以如下编写函数。

// Gets the kit by id or slug
var _getKit = function (id) {
    var deferred = $q.defer();
    // If we have no id
    if (!id) {
        // Reject our promise
        deferred.reject();
    } else {
        sharedKitService.get(id).then(function (response) {
            // Assign the response to our service
            service.models.kit = response;

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