0

运行道场 1.8.4

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

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 处理程序之间的承诺。由于 ioArgs 没有通过 promises 进行,所以在它到达我的函数时它会丢失。将我的行为 ( then()) 分配给 Promise 触发后的行必须将我的行为首先放在要解决的 Promise 堆栈中。

任何见解都值得赞赏。

4

2 回答 2

1

传递给的函数 .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;
});
于 2013-07-25T22:26:21.390 回答
1

不可能是由 分配的承诺myJsonRest.put()与在 评估的对象不同myJsonRest.put().then()

零件是同一个对象myJsonRest.put(),不用担心。您的问题是,在第一个片段中,您将.then()方法调用的结果分配给promise,并且确实返回了不同的承诺(请参阅文档)。

相比

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

var promise;
( promise = myJsonRest.put(data) ).then(function(){…});
于 2013-07-25T22:12:14.203 回答