Javascript 承诺在这种情况下如何实施?

Javascript 承诺在这种情况下如何实施?,javascript,node.js,asynchronous,promise,q,Javascript,Node.js,Asynchronous,Promise,Q,我在使用fs.readfile进行同步时遇到问题,它们在第一次时没有进行初始化,如果我再次尝试请求,则会得到结果。我知道我可以用承诺,我发现一些有用的东西。 我试过了,但没有成功。我不太明白如何实施它。如果有人能帮上忙,我将永远感激 代码: “使用严格的” var Q=要求('Q'); var fs=需要('fs'); var arrayZipBand=[]; var jsonZipCode=[]; var arrayParsedZipcodeBr=[]; exports.parse=函数(op

我在使用fs.readfile进行同步时遇到问题,它们在第一次时没有进行初始化,如果我再次尝试请求,则会得到结果。我知道我可以用承诺,我发现一些有用的东西。 我试过了,但没有成功。我不太明白如何实施它。如果有人能帮上忙,我将永远感激

代码:

“使用严格的”
var Q=要求('Q');
var fs=需要('fs');
var arrayZipBand=[];
var jsonZipCode=[];
var arrayParsedZipcodeBr=[];
exports.parse=函数(opts){
if(opts.zipBand.constructor!=数组){
opts.zipBand=[opts.zipBand];
}
if(opts.location.constructor!=数组){
opts.location=[opts.location];
}
如果(opts.config==0){
opts.zipBand.forEach(函数(文件){
readFile(文件'utf8',函数(err,logData){
如果(错误)抛出错误;
让text=logData.toString();
解码组件(文本);
让line=text.split('\n');
行。forEach(函数(行){
设parts=line.split('@');
如果(部件[1]!=未定义){
设obJson={
位置编号:零件[0],
地址:第[1]部分,
LOC_CEP_FIM:部分[2]
}
arrayZipBand.push(obJson);
}
});
});
});
opts.location.forEach(函数(文件){
readFile(文件'utf8',函数(err,logData){
如果(错误)抛出错误;
让text=logData.toString();
解码组件(文本);
让line=text.split('\n');
行。forEach(函数(行){
设parts=line.split('@');
如果(部件[1]!=未定义){
for(设i=0;i
嗯,看起来您试图在循环周期中读取文件,但以异步方式读取。第一个问题,为什么异步读取这些文件?您可以始终以同步方式读取它们:

var data=fs.readFileSync(fname, encoding);
顺便说一下,如果您希望异步读取它们并保持for…循环,那么您需要承诺、定时等待或更复杂的同步机制

您可以保持简单,无需以这种方式使用任何其他包/模块:

/**
       * 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控制台={
日志:函数{document.getElementById(“控制台”).innerHTML+=s+“
”} } var promiseAll=功能(项、块、完成、失败){ var self=这个; var承诺=[], 指数=0; items.forEach(功能(项目){ 承诺.推送(功能(项目一){ 返回新承诺(功能(解决、拒绝){ 如果(块){ 块。应用(此[项目、索引、解决、拒绝]); } }); }(项目(++索引)) }); Promise.all(promises).then(函数AcceptHandler(结果){ 如果(完成)完成(结果); },函数ErrorHandler(错误){ 如果(失败)失败(错误); }); }; //允诺者 arr=[1,2,3] 允诺人 ,功能(项目、索引、解决、拒绝){ console.log(“解析项[“+索引+”])) var-okCond=true if(okCond){resolve(item)}else{reject(新错误(“item[“+index+”])) } ,函数(结果){//聚合结果 console.log(“全部完成”+结果.length); } ,函数(错误){//error console.log(错误); });
那么,你是如何尝试使用承诺的呢?请回答您的问题,向我们展示您的尝试。你看过Q文档了吗?您是否看到了使用
Q
helper函数调用
fs
方法以获得它们的承诺的示例?@michelpm1不客气,也许您可以编辑更具指示性的标题,如promise all in for loop等。最后一个示例,显示如何将数组减少为网站url的
XMLHttpRequest
。。。
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());
});