gpt4 book ai didi

javascript - 等待 promise 从父函数解析

转载 作者:IT王子 更新时间:2023-10-29 06:08:48 24 4
gpt4 key购买 nike

我的 Node 应用程序中有一个主线程,如下所示:

function main_thread() {
console.log("Starting");
values = get_values(1);
console.log(values);
console.log("I expect to be after the values");
}

get_values 函数使用 node_redis 调用 hgetall 函数包裹。此函数提供回调,但可以被 promise :

function get_values(customer_id) {
// Uses a callback for result
new Promise(function(resolve, reject) {
redis_client.hgetall(customer_id, function (err, result) {
if (err) console.log(err)
console.log("About to resolve");
resolve(result);
});
})
.then(({result}) => {
console.log(result);
});
}

这对于函数内的 promise 链接非常有效,但在我的主线程中效果不佳,因为我等不及返回值。

以下是我在 ruby​​(我使用的主要语言)中的做法:

def get_values(customer_id)
return @redis_client.hgetall(customer_id)
end

如何在可重用函数中创建 promise 并让主线程等待函数返回 promise 的响应?

编辑:

有人建议可以通过在主线程中链接的 then 返回 promise。然而,这仍然意味着在 then block 之前执行函数调用之后主线程中的任何代码。

编辑 2:

在与一些 IRL JS 开发人员 friend 进行了长时间的讨论之后,看起来尝试创建一个同步脚本有悖于现代 JS 的精神。我将回到我的应用程序设计并致力于使其异步。

最佳答案

这是一个使用 async/await 的工作示例。我用超时和数据数组替换了 redis。

async function main_thread() {
console.log("Starting");
values = await get_values(1);
console.log(`After await: ${values}`);
console.log("I expect to be after the values");
}

async function get_values(customer_id) {
return new Promise((resolve, reject) => {
setTimeout(() => {
const result = [1, 2, 3];
console.log(`Resolving: ${result}`);
resolve(result);
}, 300);
});
}

main_thread();

进一步阅读:

关于javascript - 等待 promise 从父函数解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56495898/

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