gpt4 book ai didi

javascript - 如何包装异步包函数?

转载 作者:太空宇宙 更新时间:2023-11-04 03:05:34 24 4
gpt4 key购买 nike

我正在使用流行的 Node 库,got ,向 JSON API 发出简单的 GET 请求。

我有一个抽象请求的函数,如下所示:

function performRequest(url) {
got(url, {
json: true
}).then(function (response) {
return formatResponse(response.body);
}).catch(function (error) {
console.log(error.response.body);
});
}

formatResponse 是一个简单的同步方法,用于修改从 API 返回的 JSON。

我希望能够从另一个函数调用performRequest,然后使用返回值(解析后)。目前,由于 performRequest 未被识别为异步方法,因此我的代码正在调用它,然后立即继续。

function myBigFunction() {
var url = composeUrl();
var res = performRequest(url);

doMoreStuffWithResponse(res);
}

我知道我需要使用 Promise,但是,我总是不清楚如何将 Promise 与已经使用 Promise 的内置库函数结合使用(如本例所示)。

我也完全接受我的做法完全错误的可能性。在这种情况下,我希望能进行一些重定向。

感谢您的宝贵时间。

最佳答案

了解 Promise 是什么。它是一个,你可以这样对待它。为了“读取”该值,您将一个函数传递给 Promise 的 then 方法。您不需要 myBigFunction。您想要在 Promise 解析后运行的任何内容都只需传递给 then:

var req = performRequest(composeURL());
req.then(doStuffWithResponse);

现在,我并不特别喜欢这种方式,尽管我经常这样做。我更喜欢拥有接受 promise 并调用其then方法的函数:

var takesAPromise = function(p) {
return p.then(/* does stuff */);
};

请注意,它返回已完成任务的 Promise。但我更喜欢的是 ES6 的一句台词:

let wrap = f => p => p.then(val => f.call(null, val));

现在您可以包装任意函数以将 Promises 作为输入并将其作为输出返回。如果 Promise 是一个 monad,那么这就是它们的 bind 函数。让它与任意数量的函数无缝地工作是留给读者的练习。

关于javascript - 如何包装异步包函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41939578/

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