Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在promise解析后解析值_Javascript_Promise_Es6 Promise - Fatal编程技术网

Javascript 在promise解析后解析值

Javascript 在promise解析后解析值,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,我有这样的代码。。我想取一些内容,在加载完之后,做些什么。 所以我使用Promise.all并稍后访问解析值。但它给出的是价值,但就像承诺{‘这里的内容’}。(请参阅console.log.) 我本打算用正则表达式来提取它,但我检查了它的类型,它不是字符串,而是没有键的对象?为什么? var request=require('request'); var urls=['someurl','someurl2','someurl3']; var contents

我有这样的代码。。我想取一些内容,在加载完之后,做些什么。 所以我使用Promise.all并稍后访问解析值。但它给出的是价值,但就像承诺{‘这里的内容’}。(请参阅console.log.) 我本打算用正则表达式来提取它,但我检查了它的类型,它不是字符串,而是没有键的对象?为什么?

      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");
       });
       }

内容
仍然只是承诺。
你永远无法直接提取承诺的价值;您只能通过
then()
回调使用它

相反,
Promise.all()


更改
then()
调用以将该数组作为回调参数并直接使用它。

首先,您以错误的方式访问结果:

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()
返回的数据