运行dojo 1.8.4

使用JsonRest(而不是JsonRestStore),我向终点发出放置请求,然后返回结果并从请求响应中收集位置信息,如下所示:

var promise = myJsonRest.put(data).then(function(){
    // act when put completes successfully
    promise.ioArgs.xhr.getResponseHeader('location');
});


直到最近,这一直没有问题。然后,我开始看到TypeError,其中Promise不再包含ioArgs(无法读取未定义的属性xhr)。

断点和逐步执行堆栈表示正在创建并返回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处理程序之间的promise。由于ioArgs不会跨承诺,因此在到达我的函数时会丢失。将我的行为(then())分配给诺言后,在诺言被触发后的行中必须将我的行为放在要解决的诺言堆栈上。

任何见解均表示赞赏。

最佳答案

myJsonRest.put()分配的承诺不能与myJsonRest.put().then()评估的对象不同。


myJsonRest.put()部分是同一对象,不用担心。您的问题是在第一个代码段中,您将.then()方法调用的结果分配给promise,并且确实返回了一个不同的Promise(请参阅the docs)。

相比

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




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

关于javascript - Dojo JsonRest Promise-异步调用的顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17866075/

10-16 20:04