运行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/