Беговое додзё 1.8.4
Используя JsonRest (не JsonRestStore), я делаю запрос на размещение в конечной точке, получаю результат и собираю информацию о местоположении из ответа на запрос, например так:
var promise = myJsonRest.put(data).then(function(){
// act when put completes successfully
promise.ioArgs.xhr.getResponseHeader('location');
});
До недавнего времени это работало без проблем. Затем я начал видеть TypeError, когда обещание больше не содержало ioArgs (невозможно прочитать свойство xhr из undefined).
Точки останова и обход стека показали, что ioArgs создается и возвращается, но обещание, которое он выполнил, не было моим then(function () { promise.ioArgs /* etc... */ });
Решение, которое я нашел, состояло в том, чтобы изменить мой приведенный выше код на этот...
var promise = myJsonRest.put(data);
promise.then(function(){
// act when put completes successfully
promise.ioArgs.xhr.getResponseHeader('location');
});
... который работает правильно, но я не могу объяснить, почему.
Не может быть, чтобы обещание, назначенное myJsonRest.put()
, не было таким же, как объект, оцениваемый в myJsonRest.put().then()
. Единственная теория, которая у меня есть на данный момент, заключается в том, что JsonRest в свое собственное асинхронное время добавляет промисы, которые попадают между запросом put()
и моим обработчиком then. Так как ioArgs не передается через промисы, он теряется к тому времени, когда он попадает в мою функцию. Присвоение моего поведения (then()
) обещанию, строка после запуска обещания должна поместить мое поведение первым в стек обещаний, подлежащих разрешению.
Любое понимание ценится.