2016-09-25 2 views
1

Я создаю функцию в узле js Express, которая будет вызываться клиентами для загрузки содержимого.Возвращаемое значение обратно от Promise to Promise.All

Содержимое должно быть загружено из разных источников, и ответ должен быть отправлен обратно только после завершения всех загрузок (содержимое, загруженное узлом, зашифровано и отправлено обратно вызывающему клиенту). Итак, все функции загрузки завернуты в Promise.all (download1(), download2(), download3())

Одна из функций загрузки не только загружает контент, но также генерирует json и отправляет его обратно основная функция. Основная функция устанавливает его как заголовок ответа.

Функция 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); 
     } 

Я знаю, как отправить заголовки обратно клиенту. Моя задача - получить статусJson в функции downloadAll. Функция load1 вызывается из Promise.all(). Как только download1, download2 и donwload3 завершают «. Then». Я не могу найти способ получить данные (statusJson), возвращенные donwload1 внутри downloadAll.

+0

Что 'console.log (результат)' делает, делает он не содержит данные, которые вы ищете? – Bergi

ответ

1

Я не могу найти способ получить данные (statusJson), возвращенные donwload1 внутри downloadAll.

Это первый элемент массива, который вы получите, как result в вашем 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.all собирает результаты обещания и возвращает их в массиве в порядке, вы дали это обещания.

(Примечание стороны:. Я думаю, что вы пропали без вести после того, как ()createDirPromise)

Пример:

// (Requires Promise support in your browser) 
 
"use strict"; 
 
var createDirPromise = createPromiseFunction("createDirPromise"); 
 
var download1 = createPromiseFunction("download1"); 
 
var download2 = createPromiseFunction("download2"); 
 
var download3 = createPromiseFunction("download3"); 
 

 
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]; 
 
     console.log("statusJson = '" + statusJson + "'"); 
 
    }); 
 
} 
 
downloadAll(); 
 

 
function createPromiseFunction(name) { 
 
    return function() { 
 
    return new Promise(function(resolve) { 
 
     setTimeout(function() { 
 
     console.log("resolving " + name); 
 
     resolve("result of " + name); 
 
     }, Math.random() * 50); 
 
    }); 
 
    }; 
 
}

Смежные вопросы