2015-06-11 3 views
3

Мне нужно сделать 2 вызова AJAX. Второй зависит от первого результата вызова. Прямо сейчас я делаю это так:Угловые цепи AJAX звонки

Service.getA(car).then(function(carInfo) { 
    if (carInfo.success) { 
     Service.getB(carInfo.number).then(function(holderInfo) { 
      console.log(holderInfo); 
     }); 
    } 
}); 

Услуги:

getA: function(car) { 
    return Server.execute({ 
     method: 'GET', 
     url: 'a/a', 
     params: { 
      car: car 
     }, 
    }).then(function (carInfo) { 
     return carInfo; 
    }); 
}, 

getB метод аналогичен - только другой URL и другие параметры. Я учусь угловато и хочу реализовать этот код с помощью обещаний и отступников (google предполагает, что код будет более красивым). Как я могу это сделать?

+5

Вы уже есть, '.then' является метод обещание –

+0

я хоть что-то вроде этого: https://www.jonathanfielding.com/combining-promises-angular/ Но я не понимаю, как параметры прохождения. – Bob

+0

@Bob: вы не можете их объединить, потому что для второго вызова требуется переменная, возвращаемая с первого вызова. '$ q.all ...' одновременно вызывает оба вызова, поэтому вы не можете передавать какие-либо данные ко второму. В принципе, способ, которым вы это делаете, - это путь. – Cerbrus

ответ

3

, как вы сделали это, как правило, как цепь Ajax звонки, хотя вы можете упростить этот бит:

Service.getA(car).then(function(carInfo) { 
    Service.getB(carInfo.number).then(function(holderInfo) { 
     console.log(holderInfo); 
    }); 
    }); 

Для ошибки сервер вернуть Bad Request 400, а затем вы можете приковать .error() вместо определения успеха на основе свойства success.

Как указал Сербрус, $q.all([promise1, promise2]) выполняет их параллельно, а не один в зависимости от другого.

Ваш метод Гета должен просто вернуть обещание сам, как так:

getA: function(car) { 
    return Server.execute({ 
     method: 'GET', 
     url: 'a/a', 
     params: { 
      car: car 
     }, 
    }); 
    } 

Если вам действительно нужно, чтобы связать дополнительный обратный вызов внутри сервиса вы можете сделать это:

getA: function(car) { 
    return Server.execute({ 
     method: 'GET', 
     url: 'a/a', 
     params: { 
      car: car 
     }, 
    }).then(function (carInfo) { 
     //do something? 

    }, function() { 
     //handle error? 
    }); 
}, 
+1

'getA' не возвращает обещание' http' в примере OP. Таким образом, невозможно использовать 'success' в контроллере. – Dieterg

+0

@DieterGoetelen, да, он делает, .then() вызывает возврат объекта обещания, а не то, что это имеет значение, поскольку я считаю, что парламент говорил об имуществе успеха объекта carInfo –

+0

@ DieterGoetelen хорошая точка. Я исправил ответ. – parliament

0

Как вам 've сказал, что оба они похожи, кроме URL, параметры, которые я бы пошел с

request : function(url, params) { 
    return Server.execute({ 
     method: 'GET', 
     url: url, 
     params: params, 
    }); 
}, 

назовите его

Service.request('a/a', param).then(function(carInfo) { 
    if (carInfo.success) { 
     Service.request('b/b', carInfo.number).then(function(holderInfo) { 
      console.log(holderInfo); 
     }); 
    } 
}); 
Смежные вопросы