当前位置: 首页 > 知识库问答 >
问题:

promise在这种情况下如何实施?

萧明贤
2023-03-14

我在使用fs.readfile进行同步时遇到了一个问题,他们没有在第一次初始化,如果我再次尝试请求,那么我就有结果了。我知道我可以用promise和我从Kriskowal找到一些有用的东西。我试过但没有成功。我不太明白如何实施它。如果有人能帮忙,我将永远感激。

代码:

  "use strict"

 var Q = require('q');
 var fs = require('fs');
 var arrayZipBand = [];
 var jsonZipCode = [];
 var arrayParsedZipcodeBr = [];

 exports.parse = function(opts) {

if (opts.zipBand.constructor != Array) {
opts.zipBand = [opts.zipBand];
}
if (opts.location.constructor != Array) {
opts.location = [opts.location];
}

if (opts.config === 0) {
opts.zipBand.forEach(function(file) {
  fs.readFile(file, 'utf8', function(err, logData) {
    if (err) throw err;
    let text = logData.toString();
    decodeURIComponent(text);

    let lines = text.split('\n');

    lines.forEach(function(line) {
      let parts = line.split('@');

      if (parts[1] != undefined) {
        let obJson = {
          LOC_NU: parts[0],
          LOC_CEP_INI: parts[1],
          LOC_CEP_FIM: parts[2]

        }
        arrayZipBand.push(obJson);
      }

    });


  });

});

opts.location.forEach(function(file) {
  fs.readFile(file, 'utf8', function(err, logData) {


    if (err) throw err;

    let text = logData.toString();
    decodeURIComponent(text);

    let lines = text.split('\n');

    lines.forEach(function(line) {
      let parts = line.split('@');

      if (parts[1] != undefined) {
        for (let i = 0; i < arrayZipBand.length; i++) {
          if (parts[0] == arrayZipBand[i].LOC_NU) {
            jsonZipCode.push(arrayZipBand[i]);
          }
        }
        if (jsonZipCode === undefined) {
          throw "Was not possible to find Zipcode for the id " + parts[0];
        }

        for (let i = 0; i < jsonZipCode.length; i++) {
          let obJson = {
            LOC_NU: parts[0],
            UFE_SG: parts[1],
            LOC_NO: parts[2],
            MUN_NU: parts[8],
            LOC_CEP_INI: jsonZipCode[i].LOC_CEP_INI,
            LOC_CEP_FIM: jsonZipCode[i].LOC_CEP_FIM
          }

          arrayParsedZipcodeBr.push(obJson);
        }
        jsonZipCode = [];

      }


    });
  });
});



};
 return arrayParsedZipcodeBr;

}

共有1个答案

齐雅畅
2023-03-14

嗯,看起来你正在尝试在循环中读取文件,但是以一种异步的方式。第一个问题,为什么要异步读取这些文件?您可以始终以同步方式读取它们:

var data=fs.readFileSync(fname, encoding);

顺便说一句,如果您希望异步读取它们并保持for...循环,那么您需要一个promission、一个定时等待或一个更复杂的同步机制。

您可以保持它的简单性,而不需要以这种方式使用任何其他包/模块:

/**
       * Promise.All
       * @param items Array of objects
       * @param block Function block(item,index,resolve,reject)
       * @param done Function Success block
       * @param fail Function Failure block
       * @example

          promiseAll(["a","b","c"],
          function(item,index,resolve,reject) {
            MyApp.call(item,function(result) {
              resolve(result);
            },
            function( error ) { reject(error); }):
          },
          function(result) { // aggregated results

          },function(error) { // error

          })

        * @author Loreto Parisi (loretoparisi at gmail dot com)
       */
    promiseAll: function(items, block, done, fail) {
            var self = this;
            var promises = [],
                index = 0;
            items.forEach(function(item) {
                promises.push(function(item, i) {
                    return new Promise(function(resolve, reject) {
                        if (block) {
                            block.apply(this, [item, index, resolve, reject]);
                        }
                    });
                }(item, ++index))
            });
            Promise.all(promises).then(function AcceptHandler(results) {
                if (done) done(results);
            }, function ErrorHandler(error) {
                if (fail) fail(error);
            });
        }, //promiseAll

所以你可以把它叫做

promiseAll(arrayOfItems, function(item, index, resolve, reject) {
    // do something on item
    if (someSuccessCondOnThisItem) {
        resolve(item)
    } else {
        reject(new Error("operation failed"))
    }
}, function(results) { // aggregated results

    console.log("All done %d", results.length);

}, function(error) { // error
    console.log(error.toString());
});

请记住,这是一种非常简化的方法,但在大多数情况下,它在循环遍历数组时起作用。

下面是操场上的一个简单的工作示例:

var console = {
 log : function(s) { document.getElementById("console").innerHTML+=s+"<br/>"}
}
var promiseAll= function(items, block, done, fail) {
            var self = this;
            var promises = [],
                index = 0;
            items.forEach(function(item) {
                promises.push(function(item, i) {
                    return new Promise(function(resolve, reject) {
                        if (block) {
                            block.apply(this, [item, index, resolve, reject]);
                        }
                    });
                }(item, ++index))
            });
            Promise.all(promises).then(function AcceptHandler(results) {
                if (done) done(results);
            }, function ErrorHandler(error) {
                if (fail) fail(error);
            });
        }; //promiseAll

arr=[1,2,3]
promiseAll(arr
                ,function(item,index,resolve,reject) {
                  console.log("Resolving item[" + index+"]")
                  var okCond=true
                  if(okCond) {resolve(item)} else { reject(new Error("item[" + index+"]")) }
                }
                ,function(results) { // aggregated results
console.log("All done of "+results.length);
                }
                ,function(error) { // error
                console.log(error);
 });
<div id="console"/>
 类似资料:
  • 这是我的建筑。格雷德尔: 我试图找出问题所在,使用以下代码来分析问题: 结果是:

  • 事件处理程序添加到GameGui.java类的GridPane中,从第82行开始。 基本上,我试图找到您在网格窗格中拖动这个对象的任何节点的索引。通过将SetonMouseEnter应用到gridpane中的每个节点,我可以在不拖动的情况下完成这一任务,但是当我试图利用SetonMouseDragEnter时,我什么也没有得到。 有人有办法让这个工作吗? 这些是我应用于GridPane中节点的事件

  • 在这种情况下是否可以避免ArrayIndexOutOfBoundsException??

  • 问题内容: 我是T-SQL命令的新手,所以我在SQL逻辑中找到了一个可以使用它并想要对其进行测试的地方,但无法弄清楚我应该如何使用它: 请提出正确的用法。谢谢! 问题答案: 您在帮助中了吗?这是一个简单的例子:

  • 我需要为密码字段设置一个错误,条件是“只允许2到22个字符和符号,\-” 但是我有点困在这里了。 这是我到目前为止得到的: 但问题是,如果我输入了_或-以外的符号,错误消息仍然不会显示。对于输入长度,错误消息显示为它应该显示的样子。

  • 你好,我正在学习OOP,通过编写一个虚拟的库管理项目在Java。 在serachBook()中,如果在ArrayList中找到book,则返回book对象,如果未找到,则抛出自定义异常BookNotFound。 问题1:它应该只返回null并在调用代码时检查返回值是否为null,还是抛出自定义异常BookNotFound。 目前我认为BookNotFinder是合适的,并且目前正在这样做。然而,我