2016-04-07 17 views
1

Fs.readfile kullanarak senkronizasyonla ilgili bir sorunum var, tekrar istekte bulunmazlarsa ilk kez inicializing değiller, sonuçların var. Söz veriyorum biliyorum ve Q from Kriskowal ile yararlı bir şey buluyorum. Denedim ama başarılı olamadım. Bunu nasıl uygulayacağını çok iyi anlamadım. Birisi bununla yardımcı olabilirse, sonsuza dek minnettar olacağım.Bu durumda nasıl uygulanacağına söz veriyorum?

kodu: Eğer o zaman döngüsüne dosyaları okumaya çalışıyorum ama bir zaman uyumsuz bir şekilde gibi görünüyor

"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

https://www.npmjs.com/package/promise-denodeify –

+1

Peki, sözlerini kullanmaya çalıştın? Bize girişimi göstermek için lütfen sorunuz [değiştir]. Q belgelerini okudun mu? Q 'yardımcı işlevleri ile 'fs' yöntemlerini çağırmanın örneğini gördünüz mü? – Bergi

cevap

2

uhm. İlk soru, neden bu dosyaları okuyup uymuyor? Her zaman senkronizasyon şekilde bunları okuyabilir:

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

arada, bunları zaman uyumsuz okunmuş ve ... döngü bir Promise veya zaman bekleme ya da daha fazla kompleksi gibi bir şey gerekiyor tutmak istiyorsanız senkronizasyon mekanizması.

Bu şekilde herhangi bir başka paketler/modüllerini kullanmadan, basit tutmak edebilirsiniz: bu çok basitleştirilmiş olduğunu

/** 
     * 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 

böylece unutmayın

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

gibi diyebilirsin yaklaşım, ancak çoğu durumda diziler arasında bisiklet sürerken çalışır.

burada oyun basit bir çalışma örneği:

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"/>
Son olarak, bir liste arasında dolaşırken, bir XMLHttpRequest'ten yürütülmesini erteleme gösteren tam bir asenkron örnektir. ExecutionBlock, SimpleRequest yanıt verdikten sonra reject ve resolve çağrılarını yaparak Promise'nin then numaralı telefonu aramadan önce yürütülmesini beklemesine neden oluyor.

var console = { 
 
    log: function(s) { 
 
     document.getElementById("console").innerHTML += s + "<br/>" 
 
    } 
 
    } 
 
    // Simple XMLHttpRequest 
 
    // based on https://davidwalsh.name/xmlhttprequest 
 
SimpleRequest = { 
 
    call: function(what, response) { 
 
     var request; 
 
     if (window.XMLHttpRequest) { // Mozilla, Safari, ... 
 
     request = new XMLHttpRequest(); 
 
     } else if (window.ActiveXObject) { // IE 
 
     try { 
 
      request = new ActiveXObject('Msxml2.XMLHTTP'); 
 
     } catch (e) { 
 
      try { 
 
      request = new ActiveXObject('Microsoft.XMLHTTP'); 
 
      } catch (e) {} 
 
     } 
 
     } 
 
     // state changes 
 
     request.onreadystatechange = function() { 
 
     if (request.readyState === 4) { // done 
 
      if (request.status === 200) { // complete \t 
 
      response(request.responseText) 
 
      } else response(); 
 
     } 
 
     } 
 
     request.open('GET', what, true); 
 
     request.send(null); 
 
    } 
 
    } 
 
    //PromiseAll 
 
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 
 

 
// LP: deferred execution block 
 
var ExecutionBlock = function(item, index, resolve, reject) { 
 
    SimpleRequest.call('https://icanhazip.com/', function(result) { 
 
    if (result) { 
 
     console.log("Response[" + index + "] " + result); 
 
     resolve(result); 
 
    } else { 
 
     reject(new Error("call error")); 
 
    } 
 
    }) 
 
} 
 

 
arr = [1, 2, 3] 
 
promiseAll(arr, function(item, index, resolve, reject) { 
 
    console.log("Making request [" + index + "]") 
 
    ExecutionBlock(item, index, resolve, reject); 
 
}, function(results) { // aggregated results 
 
    console.log("All response received " + results.length); 
 
    console.log(JSON.stringify(results)); 
 
}, function(error) { // error 
 
    console.log(error); 
 
});
<div id="console" />

+1

Örnekler için teşekkürler @loretoparisi çok şey öğrendim – michelpm1

+0

@ michelpm1 hoş geldiniz, belki başlıkları için daha fazla endikatif bir şey gibi başlıkları düzenleyebilirsiniz. Son örnek, dizinin nasıl bir dizinin XMLHttpRequest 'web siteleri url ... – loretoparisi

İlgili konular