【问题标题】:Uncaught (in promise) with func().then().catch() | pass error message to outer promise function | nested promisefunc().then().catch() 未捕获(承诺)|将错误消息传递给外部承诺函数 |嵌套承诺
【发布时间】:2019-01-08 04:49:05
【问题描述】:

我正在尝试执行这个函数 varlinkCall 并在 .then() 中添加一个回调函数,并在 .catch() 中使用 varlinkCall 处理 err。

varlinkCall(utils.PODMAN, "io.projectatomic.podman.RemoveImage", JSON.parse('{"name":"' + image.Id + '"}'))
                .then((reply) => {
                    console.log(reply.image);
                })
                .catch(ex => {
                    console.log(ex);
                })

varlinkCall() 调用了 varlinkCallChannel(),我在 varlinkCallChannel() 的末尾添加了 .catch(),但是我在 varlinkCall() 函数中无法得到错误消息,它是由 varlinkCallChannel() 咳出来的。我怎样才能得到错误信息?

function varlinkCallChannel(channel, method, parameters) {
    return new Promise((resolve, reject) => {
    function on_close(event, options) {
        reject(options.problem || options);
    }

    function on_message(event, data) {
        channel.removeEventListener("message", on_message);
        channel.removeEventListener("close", on_close);

        // FIXME: support answer in multiple chunks until null byte
        if (data[data.length - 1] != 0) {
        reject("protocol error: expecting terminating 0");
        return;
        }

        var reply = decoder.decode(data.slice(0, -1));
        var json = JSON.parse(reply);
        if (json.error)
        reject(json.error)
        else if (json.parameters) {
        // debugging
        // console.log("varlinkCall", method, "→", JSON.stringify(json.parameters));
        resolve(json.parameters)
        } else
        reject("protocol error: reply has neither parameters nor error: " + reply);
    }

    channel.addEventListener("close", on_close);
    channel.addEventListener("message", on_message);
    channel.send(encoder.encode(JSON.stringify({ method, parameters: (parameters || {}) })));
    channel.send([0]); // message separator
    })
    .catch(err=>{console.log(err)});
}

/**
 * Do a varlink call on a new channel. This is more expensive than
 * `varlinkCallChannel()` but allows multiple parallel calls.
 */
export function varlinkCall(channelOptions, method, parameters) {
    var channel = cockpit.channel(Object.assign({payload: "stream", binary: true, superuser: "require" }, channelOptions));
    var response = varlinkCallChannel(channel, method, parameters);
    response.finally(() => channel.close());
    return response;
}

如果我删除 varlinkCallChannel() 末尾的 catch,我将得到“Uncaught (in promise)”。

【问题讨论】:

  • 为了记录而捕捉到的地方,记得重新抛出错误。此外,请始终使用Error(或TypeErrorRangeError 等)拒绝。
  • thx,你能给出一个具体的实现吗,rethrow?

标签: javascript reactjs promise


【解决方案1】:

是的,您应该删除varlinkCallChannel 中的catch

你的问题在varlinkCall:

export function varlinkCall(channelOptions, method, parameters) {
    var channel = cockpit.channel(Object.assign({payload: "stream", binary: true, superuser: "require" }, channelOptions));
    var promise1 = varlinkCallChannel(channel, method, parameters);
    var promise2 = promise1.finally(() => channel.close());
//  ^^^^^^^^^^^^^^^
    return promise1;
}

在这里,您正在创建第二个承诺,它将像您返回的 promise1 一样被拒绝,并且对 promise2 的拒绝不会在任何地方得到处理。你会想要返回链式承诺:

export function varlinkCall(channelOptions, method, parameters) {
    var channel = cockpit.channel(Object.assign({payload: "stream", binary: true, superuser: "require" }, channelOptions));
    return varlinkCallChannel(channel, method, parameters).finally(() => {
        channel.close()
    });
}

【讨论】:

  • 真的很有帮助。谢谢。 :)
猜你喜欢
  • 2018-10-16
  • 2021-10-17
  • 2018-04-17
  • 1970-01-01
  • 2017-07-16
  • 2016-01-21
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多