Любой способ узнать, является ли переменная обещанием angularjs?


Я делаю директиву, которая принимает функцию в качестве параметра области (scope: { method:'&theFunction' }). Мне нужно знать, является ли результат, возвращаемый этим методом, угловым обещанием (если да, то что-то произойдет на разрешении, иначе это произойдет сразу).

сейчас я тестирую, если foo.then существует, но мне было интересно, есть ли лучший способ сделать это.

4 58

4 ответа:

можно использовать $q.when чтобы обернуть объект как обещание (будь то или нет). Тогда вы можете быть уверены, что вы всегда имеете дело с обещанием. Это должно упростить код, который обрабатывает результат.

документация $q.when и здесь с $q.

Угловое по when() это хороший вариант, как Давин говорил.

Если это не соответствует вашим потребностям, то угловой внутренний способ проверки (он использует это внутри when) очень близко к тому, что вы делаете:

var ref = function(value) {
   if (value && isFunction(value.then)) {
      // Then this is promise
   }

@kayakDave, спасибо за руководство в нужное место.

угловой $q

when(value, [successCallback], [errorCallback], [progressCallback]);
            Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise. 
            This is useful when you are dealing with an object that might  or might not be a promise, 
            or if the promise comes from a source that can't be trusted.
$q.when(value).then(function (data) {
//this helps me to bind data from $resource or $http or object
}

проверить это скрипка

The $q.when() ответ кажется лучшим ответом для большинства случаев использования, я использовал instanceof на шахте.

    if(buttonData instanceof $q) {
        buttonData.then(function(actions) {
            $scope.buttonActions = actions;
        });
    } else {
        $scope.button = buttonData;
    }

кроме того, после если работал также, но я в конечном итоге иду с вышеуказанным решением.

if(Object.getPrototypeOf(buttonData) === $q.prototype) {