2014-09-11 7 views
0

У меня есть служба, которая вызывает URL-адрес для получения сведений о пользователе.AngularJS разрешает запрос AJAX с произвольными данными без вызова AJAX

... 
this.getUserDetail = function (userId) { 
    // deal cache 
    var request = $http({ 
     method: "get", 
     url: "https://stackoverflow.com/users/"+userId 
    }); 
    return request.then(successFn, errorFn); 
}; 

Но в другом месте я также получаю информацию о пользователе и создаю карту новых пользователей. Я хочу повторно использовать уже загруженного пользователя из моего объекта JavaScript.

this.getUserDetail = function (userId) { 
    if (userMap[userId]) { 
     return $q.resolve({ 
      'result': userMap['userId'] 
     }); 
    } 
    var request = $http({ 
     method: "get", 
     url: "https://stackoverflow.com/users/"+userId 
    }); 
    return request.then(successFn, errorFn); 
}; 

Но это не сработает. Я включил $q. Я не получаю ошибки JavaScript, за исключением того, что в том месте, где я использую this.getUserDetail(userId).then(..., он выдает ошибку, так как я могу не возвращать succesFn из того, как я это делаю.

Я делаю это правильно?

ответ

2

функция, которую вы называете использует AJAX.

Теперь из вашего вопроса, так как вы используете то, this.getUserDetail(userId).then(), это означает getUserDetailдолжен возвращать сам обещание.

Теперь, если я правильно понимаю, вы хотите решить обещание со случайными данными, не делая вызов AJAX, когда элемент кэшируется. В этом случае заставляйте вашу функцию условно использовать объект обещания.

this.getUserDetail = function (userId) { 
    var cachedUser = userMap(userId), 
     deferredData = $q.defer(); 

    var request = cachedUser ? deferredData.promise : $http({ 
     method: "get", 
     url: "https://stackoverflow.com/users/" + userId 
    }); 

    if (cachedUser) { 
     deferredData.resolve({ 
      'data': { 
       'result': cachedUser 
      } 
     }); 
    } 

    return request.then(successFn, errorFn); 
}; 

Редактировать:

И затем использовать его в своем контроллере:

this.getUserDetail.then(function(response){ 
    // this response object is same object with which 
    // promise was resolved. 
    // Doesn't matter whether the promise was AJAX or your own deferred. 
}); 

Не имеет значения, было ли обещание AJAX или самостоятельно отложить.

0

Вы можете использовать AngularJs встроенные в кэше:

var request = $http({ 
    method: "get", 
    url: "https://stackoverflow.com/users/"+userId, 
    cache: true 
}); 
+0

Я не кэширую данные таким образом. У меня есть другой вызов AJAX, который заполняет объект. Я хочу использовать данные этого объекта как ответ на мой вызов AJAX и «разрешить» мой запрос, используя данные этого объекта. – KingJulian

0
this.getUserDetail = function (userId) { 
    if (userMap[userId]) { 
     return $q.when(userMap[userId]); 
    } else { 
     return $http({ 
      method: "get", 
      url: "https://stackoverflow.com/users/"+userId 
     }) 
     .then(function (result) { 
      // add to userMap; 
      return result; 
     }); 
    } 
}; 
Смежные вопросы