Javascript Dojo JsonRest承诺——异步调用的顺序

Javascript Dojo JsonRest承诺——异步调用的顺序,javascript,asynchronous,dojo,promise,Javascript,Asynchronous,Dojo,Promise,运行Dojo1.8.4 使用JsonRest(不是JsonRestStore),我向端点发出一个put请求,然后返回结果并从请求响应中收集位置信息,如下所示: var promise = myJsonRest.put(data).then(function(){ // act when put completes successfully promise.ioArgs.xhr.getResponseHeader('location'); }); 直到最近,这项工作还没有出现问题

运行Dojo1.8.4

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

var promise = myJsonRest.put(data).then(function(){
    // act when put completes successfully
    promise.ioArgs.xhr.getResponseHeader('location');
});
直到最近,这项工作还没有出现问题。然后我开始看到一个TypeError,承诺不再包含ioArgs(无法读取undefined的属性xhr)

断点和遍历堆栈表明正在创建并返回ioArgs,但它实现的承诺不是我的
then(函数(){promise.ioArgs/*etc...*/})

我找到的解决办法是把我上面的代码改成

var promise = myJsonRest.put(data);
promise.then(function(){
    // act when put completes successfully
    promise.ioArgs.xhr.getResponseHeader('location');
});
…这是正确的,但我无法解释为什么

myJsonRest.put()。在这一点上,我唯一的理论是,JsonRest在其自身的异步时间内,正在添加介于
put()
请求和我的then处理程序之间的承诺。由于ioArgs没有经过承诺,所以当它到达我的函数时,它就丢失了。将我的行为(
then()
)分配给承诺激发承诺后的行必须将我的行为首先放在要解决的承诺堆栈上

任何见解都值得赞赏

myJsonRest.put()

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

比较

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


传递给
.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;
});
var promise = myJsonRest.put(data).then(function(response){
    // act when put completes successfully
    // do stuff with the response from the put request
    return response;
});