gpt4 book ai didi

javascript - 将promise.all的结果返回到另一个函数

转载 作者:行者123 更新时间:2023-11-28 18:44:53 26 4
gpt4 key购买 nike

尝试实现此功能:

   module.exports.top = function (n) {
request(getOptions(reposURL), callback);
//use result[]
};

结果是数组,我在 Promise.all 中得到:

function callback(error, response, body) {
if (!error && response.statusCode == 200) {
var repos = JSON.parse(body);
var promises = [];
repos.forEach(function (repo) {
if (condition...) {
//adding promises to promises[]
}
});
Promise.all(promises).then(res => {
var result = getResult(anotherFunction(res));
//return result to top function
});
}
};

无法理解如何将结果返回给top函数并仅在Promise.all中的请求和函数完成时才使用它。我该怎么做?

最佳答案

(注意:我自始至终都使用 ES2015,因为您的问题包含箭头函数。如果您需要在 ES5 环境中使用它并且不进行转译,则可以使用 Babel's REPL 获得转译结果.)

第 1 步是让 callback 返回一个 promise :

function callback(error, response, body) {
if (error || response.statusCode != 200) {
// Adjust the rejection as necessary...
return Promise.reject({error, statusCode: response.statusCode});
}

let repos = JSON.parse(body);
let promises = [];
repos.forEach(repo => {
if (condition...) {
//adding promises to promises[]
}
});
return Promise.all(promises).then(res => getResult(anotherFunction(res)));
}

然后,如何在 request 中使用它取决于 request 返回的内容,但鉴于它接受回调,我将在这里假设它不会返回任何东西(而不是返回一个 promise ,这会很有用)。如果这个假设是正确的,我们需要创建一个新的 Promise,并让该 Promise 等待回调的 Promise:

module.exports.top = function (n) {
let p = new Promise((resolve, reject) => {
request(getOptions(reposURL), () => {
callback.apply(this, arguments)
.then(resolve)
.catch(reject);
});
});
return p;
};

现在,top 返回一个 promise ,该 promise 将由 callback 中的 Promise.all 的结果实现。

<小时/>

当然,如果 request 是一个可以更改的函数,我们可以对整个链进行 Promise-ify,这样会干净很多:

function request(arg) {
return new Promise((resolve, reject) => {
// ...do the work, call resolve or reject as appropriate
});
}

callback 基本上是相同的,但不必再处理错误参数:

function callback(body) {
let repos = JSON.parse(body);
let promises = [];
repos.forEach(repo => {
if (condition...) {
//adding promises to promises[]
}
});
return Promise.all(promises).then(res => getResult(anotherFunction(res)));
}

然后top非常简单:

module.exports.top = function (n) {
return request(getOptions(reposURL))
.then(callback);
};

这就是 Promise 的伟大之处,它们是可组合的

关于javascript - 将promise.all的结果返回到另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35534953/

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