Javascript 承诺在这种情况下如何实施?
我在使用fs.readfile进行同步时遇到问题,它们在第一次时没有进行初始化,如果我再次尝试请求,则会得到结果。我知道我可以用承诺,我发现一些有用的东西。 我试过了,但没有成功。我不太明白如何实施它。如果有人能帮上忙,我将永远感激 代码: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
“使用严格的”
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());
});