Javascript 如何链接包含then和catch块的嵌套承诺?

Javascript 如何链接包含then和catch块的嵌套承诺?,javascript,ecmascript-6,promise,es6-promise,Javascript,Ecmascript 6,Promise,Es6 Promise,如何将ES6嵌套承诺与嵌套中具有then和catch块的每个承诺链接起来 例如,如果考虑到每个API调用都返回一个承诺,那么对于由成功和错误回调处理的以下嵌套AJAX调用实现,Promise-then和catch-blocks链接实现等价于什么呢 如果要链接承诺,可以让每个处理程序返回一个承诺,然后从那里链接then和catch函数。我相信这说明了您希望做什么: const getPromise=time,reject=false=>newpromiser,rej=>{ setTimeout=

如何将ES6嵌套承诺与嵌套中具有then和catch块的每个承诺链接起来

例如,如果考虑到每个API调用都返回一个承诺,那么对于由成功和错误回调处理的以下嵌套AJAX调用实现,Promise-then和catch-blocks链接实现等价于什么呢


如果要链接承诺,可以让每个处理程序返回一个承诺,然后从那里链接then和catch函数。我相信这说明了您希望做什么:

const getPromise=time,reject=false=>newpromiser,rej=>{ setTimeout=>拒绝?rej:res'done',time; }; 获得承诺500 .然后=>{ console.log'first response'; 返回getPromise500,错误; } .然后=>{ 记录“第二次响应”; 返回getPromise500,为真; } .catcherror=>{ log“您也可以让catch语句返回承诺”; 返回getPromise700,true } .然后=>{ //这个结构落在这里;这是对 //“第二个响应”部分返回的捕获或承诺? 记录“第三次响应”; } .catch=>{ console.error“命中错误”; }; 可以这样写:

你试过了吗?成功了,还是失败了

您可以按如下方式重新编写代码

const doAjaxCall=url=>$.ajax{url} const callURL=url=>doAjaxCallurl .done=>console.log`${url}正常 .fail=>console.log`${url}失败!`; doAjaxCall'/url1' .done=>{ console.log'url1正常!'; callURL'/url2'; } .rl'url3';
在这里,我想最后一个catch块对于前面的所有then块都是通用的。但这不是我所需要的。我需要每一个承诺在筑巢时都有自己的个体和捕捉块对。在这里,我认为只有那个些被锁住的区块才是他们各自的承诺,但并没有抓住区块。如果我们对嵌套中的每个承诺都有不同的错误处理,那么使用单独的catch块会有所帮助。@AbhinandanKhilari那么听起来好像您描述的行为本质上是嵌套的;如果你能举一个例子,说明描述这样一个链的语法是什么样的,那么我们也许能找到一些方法使之成为可能。请参考问题中提到的片段。我已在成功和错误回调中记录消息,以确定哪个API调用已成功或失败。我想知道如何实现同样的承诺。例如,关于链接语法,您可以参考您发布的代码段。在那里,我需要让每一个然后阻止它自己的捕获块,这样就可以准确地识别出在链中拒绝了哪个承诺。例如,我想可能会有与之相同数量的catch块,这些块带有类似“first error”、“second error”的日志。。。我只需要知道如何链接它们。我已经看到了代码片段,但除了说您将新的api调用放在then/catch语句中,它将返回一个承诺之外,没有什么要说的了。如果不将后续调用放在then/catch语句中,就不可能有像上面示例那样具有分支逻辑的承诺链。这意味着,如果我们必须将API调用放在then和catch块中,那么结构将像一个回调地狱。它的性质与Promise完全相反,因为Promise用于避免回调函数结构引起的回调地狱,对吗?但这里最后一个then和catch块丢失了它们所属的Promise的上下文。如果我们对嵌套中的每个承诺的已解决和拒绝有不同的实现,因此需要为每个承诺拥有一对排他的then和catch块,该怎么办?实际上,我正在ES6承诺的实现中寻找解决方案
$.ajax({ 
    url: 'url1', 
    success: function() {
        console.log('URL1 call success');
        $.ajax({    
            url: 'url2',
            success: function() {
                console.log('URL2 call success');
            },
            error:function() {
                console.log('URL2 call error');
            }
         })
    },
    error: function() {
        console.log('URL1 call error');
        $.ajax({
            url: 'url3',
            success: function() {
                console.log('URL3 call success');
            },
            error:function() {
                console.log('URL3 call error');
            }
         })
    }})
function makeAjaxCall(url){
    return new Promise((s, f) => {
        $.ajax({ 
            url: url, 
            success: s,
            error: f
        })
    })
}
makeAjaxCall('url1')
.then((data) => {
    console.log('URL1 call success');
    return makeAjaxCall('url2')
}, (error) => {
    console.log('URL1 call error');
    return makeAjaxCall('url3')
})
.then(() => {
    //It Could be Either url2 success or url3 success
}, () => {
    //It Could be Either url2 failure or url3 falure
})