Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从函数返回Axios承诺_Javascript_Promise_Axios - Fatal编程技术网

Javascript 从函数返回Axios承诺

Javascript 从函数返回Axios承诺,javascript,promise,axios,Javascript,Promise,Axios,有人能解释一下为什么返回Axios承诺允许进一步链接,但在应用then()/catch()方法后返回却不允许 例如: consturl='1〕https://58f58f38c9deb71200ceece2.mockapi.io/Mapss' 函数createRequest1(){ const request=axios.get(url) 要求 .then(result=>console.log(‘(1)内result:’,result)) .catch(error=>console.erro

有人能解释一下为什么返回Axios承诺允许进一步链接,但在应用
then()/catch()
方法后返回却不允许

例如:

consturl='1〕https://58f58f38c9deb71200ceece2.mockapi.io/Mapss'
函数createRequest1(){
const request=axios.get(url)
要求
.then(result=>console.log(‘(1)内result:’,result))
.catch(error=>console.error(“(1)内部错误:”,error))
退货申请
}
函数createRequest2(){
const request=axios.get(url)
退货申请
.then(result=>console.log(‘(2)内result:’,result))
.catch(error=>console.error(“(2)内部错误:”,error))
}
createRequest1()
.then(result=>console.log(“(1)外部结果:”,result))
.catch(error=>console.error(“(1)外部错误:”,error))
createRequest2()
.then(result=>console.log(“(2)外部结果:”,result))
.catch(error=>console.error(“(2)外部错误:”,error))

您的第一个示例返回了原始承诺。第二个示例返回一个不同的承诺,即通过调用
catch
创建的承诺

两者之间的关键区别是:

  • 在第二个示例中,您没有传递解析值,因此您的
    then
    返回的承诺将使用
    未定义的
    (console.log的返回值)解析

  • 在第二个示例中,您正在将拒绝转换为具有
    未定义的
    的解决方案(通过返回
    控制台.log的结果
    退出
    捕获
    )。不抛出或返回被拒绝的承诺的
    catch
    处理程序将拒绝转换为解决方案

  • 承诺链的一个关键点是,它们改变了结果;每次调用
    then
    catch
    都会创建一个新的承诺,当结果通过它们时,它们的处理程序可以修改向下游发送的内容

    通常的模式确实是返回链的结果,但链中的函数要么有意地转换结果,要么将其传递。通常,除了在链的末端,您不会有
    catch
    处理程序,除非您使用它来纠正错误条件(有意地将拒绝转换为解决方案)

    如果您只想记录通过的内容,同时仍允许调用方查看,但出于任何原因确实想返回链的结果,您可以这样做:

    return request
        .then(result => { console.log(result); return result; })
        .catch(error => { console.error(error); return Promise.reject(error); });
    
    或者使用
    抛出

    return request
        .then(result => { console.log(result); return result; })
        .catch(error => { console.error(error); throw error; });
    

    第二个示例返回链的“结束”,第一个示例返回
    请求
    承诺真正的问题是,
    中没有返回任何内容。然后/.catch
    -这将导致承诺被解析为
    未定义
    对不起,我的错误,他们正在返回调用
    console.log
    的结果-这是
    未定义的
    (我瞥了一眼小提琴-这不是委婉的说法)谢谢@t.J,你的解释肯定有助于更详细地理解链接承诺。谢谢@T.J,你说得再清楚不过了。这篇文章帮助我解决了同步api调用的问题。