在$.ajax().done()调用链中,我可以为next.done()转换数据吗?

在$.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=&

我有一个现有的api例程,我想在调用下一个.done之前插入转换。在我的例子中,这需要一个简单的额外级别的JSON.parse,但更广泛的问题是,我能对下一个.done能够看到的响应数据做些什么吗

以这个api为例:

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);
});