代码之家  ›  专栏  ›  技术社区  ›  Ken Ingram

我是否正确使用此承诺功能

  •  0
  • Ken Ingram  · 技术社区  · 7 年前

    我正在使用node从一个URL中使用cheerio获取一些数据。

    const request=require('request');
    const cheerio=require('cheerio');
    const Promise = require('promise');
    

    功能 getDataParms(parm1, parm2) 返回Promise对象。

    通过调用GetDataParms获取一组更改参数 retrieveAllData(parm1, limit)

    最终输出来自

    var test2 = retrieveAllData('foo','2015');
    console.log(test2);
    

    node script.js的输出

    // [ Promise { _75: 0, _83: 0, _18: null, _38: null } ]
    

    在某个地方,我没有正确地使用Promise方法,我不知道在哪里。我需要一些有经验的眼睛来帮助我找出我做错了什么。

    代码:

    const request=require('request');
    const cheerio=require('cheerio');
    const Promise = require('promise');
    
    var dateVal = new Date();
    var test2 = [];
    
    function retrieveAllData(parm1, limit){
        var output = [];
        var intermediate;
    
        for (var j=1; j <= limit; j++){
            var objKey = parm1 + "_data";
            var results = {
                "data1": null,
                [objKey]: null
            };
    
            results.data1 = j;
            objKey = objKey + "_" + j;
            results[objKey] = getDataParms(parm1, j).then(function(value){
                //console.log(value);
                return value;
            });
    
            //console.log(results[objKey]);
            output.push(results[objKey]);
        }
        return output;
    }
    
    // Returns a Promise array
    function getDataParms(parm1, parm2){
        var sourceURL = "http://website/source=" + material + "&parm1=" + parm1 + "&parm2=parm2";
        var parsedResults = [];
        var metadata = {
          record_parm2: time_period,
          record_no: null,
          record_date: null,
          col1: null,
          col2: null,
          col3: null
        };
    
        return new Promise(function(fulfill, reject){
                request(sourceURL, function(error,response,html){
                  if (error){
                    reject(error);
                  } else if (!error && response.statusCode == 200){
                    var $ = cheerio.load(html);
                    $(".data tr").each(function(i, element){
                        metadata.record_no = i;
                            $(this).find("td").each(function(cellindex){
                              switch(cellindex){
                               case 0:
                                    metadata.record_date = $(this).text();
                                break;
                               case 1:
                                    metadata.col1 = parseFloat($(this).text());
                                break;
                               case 2:
                                    metadata.col2 = parseFloat($(this).text());
                                break;
                               case 3:
                                    metadata.col3 = parseFloat($(this).text());
                                break;
                              }
                          });   
    
                        parsedResults.push(metadata);
                    });
    
                    fulfill(parsedResults);
                    }
            });
        });
    }
    
    var test2 = retrieveAllData('foo','2015');
    console.log(test2);
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   CertainPerformance    7 年前

    因为每个 getDataParms 呼叫返回 Promise 你应该等待所有这些承诺首先得到解决 Promise.all . 还有,因为 获取数据参数 返回 承诺 , retrieveAllData ,消耗 getDataParams ,还应返回 承诺 为了最终 results 以后可用。而不是 var test2 = retrieveAllData(... ,你应该打电话 .then 检索所有数据 打电话。

    function retrieveAllData(parm1, limit){
      // Create an array of Promises, with `j`'s values being 0 to `limit - 1`:
      const allPromises = Array.from(
        { length: limit },
        (_, j) => {
          // Make j start at 1 rather than 0:
          j++;
          const objKey = parm1 + "_data_" + j;
          // After getDataParms resolves, return an object with keys `data1` and `[objKey]`:
          return getDataParms(parm1, j)
            .then((parms) => ({
              data1: j,
              [objKey]: parms
            }));
        }
      );
      return Promise.all(allPromises);
    }
    

    和它一起消费 然后 :

    retrieveAllData('foo','2015')
      .then(test2 => {
        console.log(test2);
      });
    

    使用 for 循环而不是功能性的循环如下:

    function retrieveAllData(parm1, limit){
      const allPromises = [];
      for (let year = 1990; year <= limit; year++) {
        const objKey = parm1 + "_data_" + year;
        allPromises.push(
          getDataParms(parm1, j)
          .then((parms) => ({
            data1: j,
            [objKey]: parms
          }))
        )
      }
      return Promise.all(allPromises);
    }
    
        2
  •  0
  •   Arif Khan codemt    7 年前

    你需要使用 Promise.all 在您的情况下,下面的示例可能会帮助您

    function retrieveAllData(parm1, limit) {
        var output = [];
        for (var j = 1; j <= limit; j++) {
            output.push(getDataParms(parm1, j));
        }
        return Promise.all(output);
    }
    
    var test2 = retrieveAllData('foo', '2015'); // this will return a promise
    test2.then(function (result) {
        console.log(result);
    })
    
    推荐文章