在$.ajax().done()调用链中,我可以为next.done()转换数据吗?
我有一个现有的api例程,我想在调用下一个.done之前插入转换。在我的例子中,这需要一个简单的额外级别的JSON.parse,但更广泛的问题是,我能对下一个.done能够看到的响应数据做些什么吗 以这个api为例:在$.ajax().done()调用链中,我可以为next.done()转换数据吗?,ajax,typescript,transform,chaining,Ajax,Typescript,Transform,Chaining,我有一个现有的api例程,我想在调用下一个.done之前插入转换。在我的例子中,这需要一个简单的额外级别的JSON.parse,但更广泛的问题是,我能对下一个.done能够看到的响应数据做些什么吗 以这个api为例: function foo(){ return $.ajax( ... ) .done(data=> { .. do something with the data here ...}); } 来电者可以看到: foo().done(data=&
function foo(){
return $.ajax( ... )
.done(data=> { .. do something with the data here ...});
}
来电者可以看到:
foo().done(data=>{ .. transformed data visible here ... });
jQuery的ajax返回一个延迟对象,它现在是符合Promises/a+规范的承诺。因此,您可以切换到使用then,它具有您想要的语义:
function foo(){
return $.ajax( ... )
.then(data => {
return /*...the transformed data...*/;
});
}
然后:
注意:如果调用foo的代码无法更改,则无需担心;完成后,也将看到更新的数据。但它必须在foo内部。如果可以,也可以在调用foo的代码中切换到then,但是如果不能,也可以
下面是一个在foo中使用then并在调用它时完成的实例:
你在评论中问:
进一步问题;有没有办法在错误链中进行相同类型的转换 是的!承诺的设计使得这两条路径可以在每一级进行转换。要转换通过链的拒绝,您可以返回被拒绝的承诺return promise.rejectx或抛出x。x可以是您想要的任何东西,尽管按照惯例,它通常是一个错误对象 例如: jQuery的ajax返回一个延迟对象,它现在是符合Promises/a+规范的承诺。因此,您可以切换到使用then,它具有您想要的语义:
function foo(){
return $.ajax( ... )
.then(data => {
return /*...the transformed data...*/;
});
}
然后:
注意:如果调用foo的代码无法更改,则无需担心;完成后,也将看到更新的数据。但它必须在foo内部。如果可以,也可以在调用foo的代码中切换到then,但是如果不能,也可以
下面是一个在foo中使用then并在调用它时完成的实例:
你在评论中问:
进一步问题;有没有办法在错误链中进行相同类型的转换 是的!承诺的设计使得这两条路径可以在每一级进行转换。要转换通过链的拒绝,您可以返回被拒绝的承诺return promise.rejectx或抛出x。x可以是您想要的任何东西,尽管按照惯例,它通常是一个错误对象 例如:
进一步问题;有没有办法在错误链中进行相同类型的转换?例如.foo.done..success…faildata=>{transformed data here..}我发现一个带有a的错误部分的常规返回导致.done触发,就好像它成功了一样。如果我抛出数据,则会触发.fail,但不包含数据。@Petebr-是的,承诺链也允许您这样做。:-我添加了一个示例。不管它值多少钱,我在新书的第8章中对承诺做了一些详细的阐述;有关详细信息,请参阅我的个人资料。我知道,我在抛出新的错误构造时丢失了它。@Petebr-Huh,我不认为这是done/fail的基本要求,而不是than/catch。这是最佳实践,但不是必需的……你是对的,实际上并不是必需的。我引入了一个新的和微妙的错误与抛出内尝试。。。抓住它当然抓住了自己!进一步问题;有没有办法在错误链中进行相同类型的转换?例如.foo.done..success…faildata=>{transformed data here..}我发现一个带有a的错误部分的常规返回导致.done触发,就好像它成功了一样。如果我抛出数据,则会触发.fail,但不包含数据。@Petebr-是的,承诺链也允许您这样做。:-我添加了一个示例。不管它值多少钱,我在新书的第8章中对承诺做了一些详细的阐述;有关详细信息,请参阅我的个人资料。我知道,我在抛出新的错误构造时丢失了它。@Petebr-Huh,我不认为这是done/fail的基本要求,而不是than/catch。这是最佳实践,但不是必需的……你是对的,实际上并不是必需的。我引入了一个新的和微妙的错误与抛出内尝试。。。抓住它当然抓住了自己!
function foo(){
return $.ajax({
method: "POST",
url: "/echo/json/",
data: {
json: '{"key":"value"}',
delay: 1
}
})
.then(data => {
return {key: data.key.toUpperCase()};
});
}
// Just to show that `done` sees the updated data
foo().done(data => { console.log(data); });
function foo(){
return $.ajax({
method: "POST",
url: "/echo/bad-url-not-on-jsfiddle",
data: {
json: '{"key":"value"}',
delay: 1
}
})
.then(data => {
return {key: data.key.toUpperCase()};
})
.catch(error => {
const myError = new Error("ajax failed");
myError.originalError = error;
myError.otherInformation = "whatever";
throw myError;
});
}
foo()
.done(data => { console.log(data); })
.fail(error => {
console.error(error);
console.error(error.otherInformation);
});