尝试实现此功能:
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中的请求和函数完成时使用它。我怎么能这样做?
答案 0 :(得分:3)
(注意:我一直使用ES2015,因为你的问题包括一个箭头功能。如果你需要在ES5环境中使用它并且没有转换,你可以使用{{3获得一个转换结果}}。)
第1步是让callback
返回一个承诺:
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
返回的内容,但是如果它接受回调,我会在这里假设它不会返回任何内容(而不是返回一个本来有用的承诺)。如果这个假设是正确的,我们需要创建一个新的承诺,让这个承诺等待callback
的承诺:
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.all
中callback
的结果将履行的承诺。
当然,如果request
是一个你可以改变的功能,我们可以保证 - 如果是整个链,那将更加清洁:
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);
};
这是承诺的好处,它们是可组合的。
答案 1 :(得分:0)
return
Promise
callback
函数中的return
。 callback
request
函数中的module.exports.top = function (n) {
request(getOptions(reposURL), callback).then(result => {
//use result[]
});
}
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[]
}
});
return Promise.all(promises).then(res => {
var result = getResult(anotherFunction(res));
//return result to top function
return result;
});
}
};
也是fly.play.s3._
。然后您可以将该函数用作链式承诺,如下所示:
fly.play.s3.S3