У меня есть приложение для веб-сопоставления, в котором есть кнопка, которая при нажатии вызывает веб-службу, которая возвращает большой JSON. Часть строки JSON представляет собой пространственную область, в которой мне нужно увеличить карту. Основные настройки JSON (раздел «Результаты» ниже) занимают несколько секунд для обработки и не связаны с разделом «extentToZoomTo». API-интерфейс отображения, который я использую, имеет метод setExtent, который возвращает объект DOJO Deferred. Метод setExtent создает изображение на сервере и может занять несколько секунд. То, что я хотел бы сделать, - вызвать метод setExtent сразу после того, как я получу JSON, и пока сервер занят работой над этим, клиентский код javaScript в браузере может работать одновременно с секцией «результаты» JSON. Как я могу это сделать? Я обнаружил, что если я просто вызову setExtent, прежде чем начать обработку раздела «результаты», он фактически не отправит этот запрос на сервер до после, раздел результатов полностью обработан. Я могу проверить это поведение, проверив вкладку «Сеть» в инструментах разработчика (есть несколько вторых промежутков между тем, когда я получаю JSON и когда вызывается метод setExtent). Я предполагаю, что это связано с тем, что setExtent отложен. Как я могу немедленно его запустить?Как я могу принудительно выполнить метод Отсрочка?
{
"extentToZoomTo": {
"xmin": 1234,
"ymin": 4567,
"xmax": 2345,
"ymax": 5678
},
"results": {
//A very large amount of data here that takes several seconds to process
}
}
---- EDIT --- Могу ли я запустить два Отсроченные-х параллельно каким-то образом? Код Pseudo TypeScript ниже
mainMethod(){
let bigJSONString: string = "big json string with results and extent info retrieved from web service call";
//get extent info from bigJSONString...for now, just mock the values
let xmin = 123; let ymin = 234; let xmax = 345; let ymax = 789;
let jsonExtent: esri.geometry.Extent = new esri.geometry.Extent(xmin, ymin, xmax, ymax, spatialRef);
//I want to call setExtent and handResults in parallel...how do I do that?
let setExtentDeferred: dojo.Deferred = myMap.setExtent(jsonExtent);
let handleResultsDeferred: dojo.Deferred = this.handleResultsDeferred(bigJSONString);
dojo.Deferred.RUN_IN_PARALLEL(setExtentDeferred, handleResultsDeferred);
}
handleResultsDeferred(jsonString: string): dojo.Deferred {
//This code does the real work...should I return a dojo.Deferred from here?
return new dojo.Deferred();
}
Вы можете использовать 2 Deferreds и запускать их параллельно. Вы можете использовать dojo/offfer/all, чтобы сделать что-то после возвращения 2 ответов. Поместите в некоторый код, если вам нужна дополнительная помощь. – Philippe
Philipe - спасибо, что вернулись ко мне. Я не совсем уверен, как делать то, что вы предлагаете. – DevonTaig
Вам нужно будет разделить бэкэнд на 2 отдельные конечные точки. Тот, который возвращает extentToZoomTo, и другой, который возвращает результаты. У вас есть контроль над бэкэнд? – Philippe