gpt4 book ai didi

javascript - promise 并修改返回值

转载 作者:行者123 更新时间:2023-11-30 11:06:59 24 4
gpt4 key购买 nike

我需要修改现有代码以支持同步和异步结果。虽然我可以在 C# 中轻松处理 Taskawait,但即使从 MDN 和其他页面阅读了大量内容后,我还是无法理解 JavaScript Promise

现有代码如下所示:

function dispatchCall() {
// ...

try {
let result = fn.apply(context, args);

if (result !== undefined) {
return { status: 0, result: result };
}
return { status: 0 };
}
catch (err) {
if (typeof err === "object") {
return { status: 400, errorMessage: err.name + ", " + err.message, stack: err.stack };
}
return { status: 400, errorMessage: err };
}
}

fn 是要调用的函数。它是由我的 API 的用户定义的,所以我不知道它会做什么。现在它将始终返回一个值或抛出异常。该值将包装在传递回 dispatchCall 的远程调用者的消息对象中。

现在 fn 需要返回一个 Promise,因为它要用在结果不是立即可用的异步工作流中。

我需要测试 result 是否是 Promise(或“thenable”)并采取相应行动。在这种情况下,当结果 promise 得到解决时,我需要将结果值包装在适当的消息对象中,并将其作为另一个 promise 传递给 dispatchCall 的调用者。然后我可以在那里轻松处理它。

就是我解决不了的“传值改值”。

我会这样开始:

function dispatchCall() {
// ...

try {
let result = fn.apply(context, args);

// --------------------------------------------------
if (result && typeof result.then === "function") {
result.then(function (result) {
// Like so?
if (result !== undefined) {
return { status: 0, result: result };
}
return { status: 0 };
})
.catch(function (err) {
// Does this catch errors?
if (typeof err === "object") {
return { status: 400, errorMessage: err.name + ", " + err.message, stack: err.stack };
}
return { status: 400, errorMessage: err };
});
return new Promise(function(resolve, reject) {
// What about this?
// When should I call resolve and reject and with what arguments?
});
// Must return a Promise and not continue at this point!
}
// --------------------------------------------------

if (result !== undefined) {
return { status: 0, result: result };
}
return { status: 0 };
}
catch (err) {
if (typeof err === "object") {
return { status: 400, errorMessage: err.name + ", " + err.message, stack: err.stack };
}
return { status: 400, errorMessage: err };
}
}

这应该如何粘在一起?

查看支持表后,我决定放弃对 Internet Explorer 的支持并使用 ES6 Promises。不涉及外部图书馆。如果某些 IE 会执行此操作,它应该继续使用同步函数并允许使用异步代码失败。

我的目标环境是浏览器和 Node.js。

最佳答案

当你有一个 thenable 时,不需要用 new Promise 创建一个 promise。

你可以只返回 return result.then(......,或者如果你想确保返回一个 Promise 实例(而不仅仅是 then()。 catch() 返回),然后将结果传递给:Promise.resolve()

    if (typeof result.then === "function") {
return Promise.resolve(result).then(function (result) {
if (result !== undefined) {
return { status: 0, result: result };
}
return { status: 0 };
})
.catch(function (err) {
if (typeof err === "object") {
return { status: 400, errorMessage: err.name + ", " + err.message, stack: err.stack };
}
return { status: 400, errorMessage: err };
});
}

如果在 catch 回调中发生错误,则返回的 promise 将被拒绝。调用者可以通过链接到它自己的 catch 来处理它。

关于javascript - promise 并修改返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55211758/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com