Ответ 1
Существует несколько моделей для зависимого promises и передачи данных от одного к другому. Какой из них лучше всего работает, зависит от того, нужны ли вам только предыдущие данные в следующем вызове или нужен ли вам доступ ко всем предыдущим данным. Вот несколько моделей:
Результат подачи от одного до следующего
callhttp(url1, data1).then(function(result1) {
// result1 is available here
return callhttp(url2, data2);
}).then(function(result2) {
// only result2 is available here
return callhttp(url3, data3);
}).then(function(result3) {
// all three are done now, final result is in result3
});
Присвоить промежуточные результаты более высокой шкале
var r1, r2, r3;
callhttp(url1, data1).then(function(result1) {
r1 = result1;
return callhttp(url2, data2);
}).then(function(result2) {
r2 = result2;
// can access r1 or r2
return callhttp(url3, data3);
}).then(function(result3) {
r3 = result3;
// can access r1 or r2 or r3
});
Накопление результатов в одном объекте
var results = {};
callhttp(url1, data1).then(function(result1) {
results.result1 = result1;
return callhttp(url2, data2);
}).then(function(result2) {
results.result2 = result2;
// can access results.result1 or results.result2
return callhttp(url3, data3);
}).then(function(result3) {
results.result3 = result3;
// can access results.result1 or results.result2 or results.result3
});
Гнездо, поэтому все предыдущие результаты могут быть доступны
callhttp(url1, data1).then(function(result1) {
// result1 is available here
return callhttp(url2, data2).then(function(result2) {
// result1 and result2 available here
return callhttp(url3, data3).then(function(result3) {
// result1, result2 and result3 available here
});
});
})
Разбить цепочку на независимые части, собрать результаты
Если некоторые части цепочки могут работать независимо друг от друга, а не друг за другом, вы можете запускать их отдельно и использовать Promise.all()
, чтобы знать, когда эти несколько частей будут выполнены, и тогда у вас будут все данные из этих независимых части:
var p1 = callhttp(url1, data1);
var p2 = callhttp(url2, data2).then(function(result2) {
return someAsync(result2);
}).then(function(result2a) {
return someOtherAsync(result2a);
});
var p3 = callhttp(url3, data3).then(function(result3) {
return someAsync(result3);
});
Promise.all([p1, p2, p3]).then(function(results) {
// multiple results available in results array
// that can be processed further here with
// other promises
});