将promise.all的结果返回给另一个函数

时间:2016-02-21 10:27:47

标签: javascript

尝试实现此功能:

   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中的请求和函数完成时使用它。我怎么能这样做?

2 个答案:

答案 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.allcallback的结果将履行的承诺。

当然,如果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函数中的returncallback 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