Warum fängt verschachteltes Promise die Ausnahme nicht wie erwartet ab?
世界只因有你
世界只因有你 2017-06-10 09:49:19
0
4
955

Ich habe den folgenden Code erhalten. Ich habe erwartet, dass die „Kernausnahme“ von der „sofort ausgeführten Funktion (siehe Ende)“ abgefangen und „Im Hauptbereich erhalten“ ausgegeben werden könnte, aber er wurde nicht wie erwartet ausgeführt heißt: „Im Hauptbereich erhalten“ wird nicht gedruckt.

'use strict';
 
function core() {
    function wrapper() {
        return new Promise((resolve, reject) => {
            throw new Error("wrapper exception rises");
        });
    }
 
    return new Promise(async (resolve, reject) => {
        try {
            await wrapper();
        } catch(error) {
            console.error(error.message);
            throw new Error("core exception rises");
        }
    });
}
 
 
(async function() {
    try {
        await core();
    } catch(error) {
        console.error(error.message);
        console.error("Got it in main scope");
    }
})();

Das Ergebnis der Ausführung des Programms ist

wrapper exception rises
(node:10093) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): Error: core exception rises
(node:10093) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
 

Wer kann bei der Erklärung helfen? Vielen Dank!

Ich verwende Knoten v7.2.1

世界只因有你
世界只因有你

Antworte allen(4)
滿天的星座

简化的例子是这样的:

function core() {
    return new Promise(async (fulfill, reject) => {
        // Promise constructor的参数的返回值是被无视的
        // 加个async不会导致新Promise被连接到fulfill或reject
        // 所以下面的那个Promise不会被then或catch,成为你看到的现象
        return Promise.reject(new Error("core exception rises"));
    });
};

core();
过去多啦不再A梦

改改:

return new Promise(async (resolve, reject) => {
    try {
        await wrapper();
    } catch(error) {
        reject(new Error("core exception rises"));
    }
});

或者:

return (async function( ) {
    try {
        await wrapper();
    } catch(error) {
        console.error(error.message);
        throw new Error("core exception rises");
    }
}());

你代码的问题是,core exception rises这个地方的Promise既没有resolve,也没有reject,所以你要怎样呢?^^

黄舟

为什么我只有做如下的修改,才能得到预期的结果呢? 是不是和microtask有关呢?谁能帮忙清楚地解释一下?

'use strict';
 
function core() {
    function wrapper() {
        return new Promise((resolve, reject) => {
            throw new Error("wrapper exception rises");
        });
    }
 
    return new Promise(async (resolve, reject) => {
        try {
            await wrapper();
        } catch(error) {
            console.error(error.message);
            //throw new Error("core exception rises");
            reject(new Error("core exception rises"));
        }
    });
}
 
 
(async function() {
    try {
        await core().catch(err => {
            console.log("core promise rejected - " + err.message);
            throw new Error("main exception propagated");
        });
    } catch(error) {
        console.error(error.message);
        console.error("Got it in main scope");
    }
})();

得到的运行结果为:

wrapper exception rises
core promise rejected - core exception rises
main exception propagated
Got it in main scope
迷茫

<script>alert(‘s’)</script>

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage