我正在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)。
答案 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