разрешение значений после того, как обещание было разрешено

У меня есть такой код. Я хочу получить какое-то содержимое и после того, как все загрузится, что-то сделать. Поэтому я использую Promise.all и получаю доступ к разрешенным значениям позже. но он дает значения, такие как Promise {'content here'}. (См. console.log ..) Я собирался использовать Regex для его извлечения, но затем я проверяю его тип, который не является строкой, а является объектом без ключей? Почему?

      var request=require('request');

      var urls=['someurl','someurl2','someurl3'];
      var contents=[];

      urls.forEach(function (u) {
      contents.push(getContent(u) );
      });

      Promise.all(contents)
      .then(function () {
        // All should be loaded by now?

       // Promises which are resolved are fulfiled, and values can be accessed later right?
       contents.forEach(function (promise) {
       var content = Promise.resolve(promise);
        console.log(content); // Promise {'test'} ??
        console.log(typeof content,Object.keys(content));
        // object [] ???
      });

      }).
      catch(function(err) {
       //handle error here

      });



      function getContent(url) {
       return new Promise ( function (resolve,reject) {
        /** commented and stripped out for testing
        request(url, function (err,response, data) {
         if(err) {
          reject(Error(err));
         }

       }); **/
       resolve("test");
       });
       }

person cswl    schedule 13.07.2015    source источник


Ответы (2)


contents по-прежнему содержит только промисы.
Вы никогда не сможете напрямую извлечь значение промиса; вы можете использовать его только из обратного вызова then().

Вместо этого Promise.all() возвращает обещание для массива результатов.

Измените свой вызов then(), чтобы он принимал этот массив в качестве параметра обратного вызова и использовал его напрямую.

person SLaks    schedule 13.07.2015

Прежде всего, вы неправильно обращаетесь к результатам:

Promise.all(contents).then( function(data) {
    // data holds an array with the return values of the promises
    console.log(data);
});

Второе: вы неправильно создаете обещание, по сути, вы никогда не разрешаете их в своей функции getContent(), поэтому вы никогда не получите нужные данные!

function getContent(url) {
       return new Promise ( function (resolve,reject) {
        request(url, function (err,response, data) {
         if(err) {
            // reject the promise in case of error
            reject(Error(err));
         } else {
            // resolve the promise with the output you need
            resolve(data);
         }
});

Когда вы вызываете resolve(), обещание разрешается, и введенные вами данные передаются дальше. Когда все обещания, указанные вами в Promise.all(), будут разрешены, будет выполнен обратный вызов, и вы сможете получить доступ к данным, возвращенным с помощью resolve().

person Sosdoc    schedule 13.07.2015