返回值从Promise返回Promise.All

时间:2016-09-25 10:44:02

标签: javascript node.js promise

我正在Node js Express中创建一个函数,客户端将调用该函数来下载内容。

需要从不同的源下载内容,并且只有在所有下载完成后才会发回响应(节点下载的内容被压缩并发送回主叫客户端)。因此,所有下载函数都包含在Promise.all中(download1(),download2(),download3())

其中一个下载功能不仅可以下载内容,还可以生成json并将其发送回主函数。 main函数将其设置为响应头。

客户端调用的API函数如下所示

function downloadAll(request, response) {
    // Download content only after folders are created
    return createDirPromise.then(function (result) { 
       var statusJson = ... // somehow get the status json from download1() so that it can be send to the client 
       return Promise.all([download1(contentsJson), download2(contentsJson), download3(contentsJson)]);
    })
    .then(function (result) {
        return new Promise(function (resolve, reject) {             
        // Create zip. Here is the zip creation logic.  
        // Once zip is created, send it to client as a buffer
            zipdir(zipFolderPath, function (err, buffer) { 
            if (err) { 
               console.log('Error while zipping!!! '+JSON.stringify(err));
                    return reject({ data: null, resp_status_code: 500, resp_status_message: JSON.stringify(err)});
            }                        }
            console.log('Zipping successful');
            return resolve(
               { 
                 data: buffer, 
                 resp_status_code: 200, 
                 resp_status_message: "Zip succeeded", 
                 headers: statusJson
               });
        })
     })  
    .catch(function (error) { 
        return { 
            data: 'Error in any of above ' + error, 
            resp_status_code: 500, 
            resp_status_message: 'Error while zipping'
        }
}

这就是download1函数的样子

function download1(contentsJson) {
    return new Promise(function(resolve, reject) {
            //set the status json here
            var statusJson = { "key1": "value1", "key2": "value2"};
            //do the download stuff here and return the statusJson
            console.log('Downloading complete, return the status so that it can be send to the client'); 
            resolve(statusJson);
       }

我知道如何将标头发送回客户端。我的挑战是如何在downloadAll函数中获取statusJson。从Promise.all()中调用download1函数。下载1后,下载2和donwload3完成'.then'即可执行。我无法找到一种方法来获取donAload1在downloadAll中返回的数据(statusJson)。

1 个答案:

答案 0 :(得分:1)

  

我无法找到一种方法来获取donAload1在downloadAll中返回的数据(statusJson)。

它是您在result的{​​{1}}回调中以then收到的数组中的第一个条目:

Promise.all()

function downloadAll(request, response) { return createDirPromise.then(function (result) { return Promise.all([download1(contentsJson), download2(contentsJson), download3(contentsJson)]); }) .then(function (result) // **** Here, the result of download1 is result[0] var statusJson = result[0]; 将promise结果收集在一起,并按照你给它承诺的顺序将它们返回到一个数组中。

(旁注:我认为您Promise.all后遗失()。)

示例:



createDirPromise