Dojo JsonRest Promise порядок асинхронных вызовов

Беговое додзё 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()) обещанию, строка после запуска обещания должна поместить мое поведение первым в стек обещаний, подлежащих разрешению.

Любое понимание ценится.


person Andrew    schedule 25.07.2013    source источник


Ответы (2)


Не может быть, чтобы обещание, назначенное myJsonRest.put(), не было таким же, как объект, оцениваемый в myJsonRest.put().then().

Это тот же объект для части myJsonRest.put(), не беспокойтесь. Ваша проблема в том, что в первом фрагменте вы присваиваете результат вызова метода .then() promise, и это возвращает другое обещание (см. документы).

Сравнивать

var promise;
( promise = myJsonRest.put(data).then(function(){…}) );

to

var promise;
( promise = myJsonRest.put(data) ).then(function(){…});
person Bergi    schedule 25.07.2013

Функция, переданная .then(), должна возвращать значение, которое вы хотите разрешить promise:

var promise = myJsonRest.put(data).then(function(response){
    // act when put completes successfully
    // do stuff with the response from the put request
    return response;
});
person idbehold    schedule 25.07.2013