【发布时间】:2016-04-10 06:12:43
【问题描述】:
我试图了解为什么以下承诺设置不起作用。
(注意:我已经用 async.map 解决了这个问题。但我想了解为什么我在下面的尝试没有奏效。)
正确的行为应该是:bFunc 应该运行尽可能多的时间以 fs 读取所有图像文件(下面的 bFunc 运行两次),然后 cFunc 控制台打印“End”。
谢谢!
尝试 1:它在 cFunc() 处运行并停止。
var fs = require('fs');
bFunc(0)
.then(function(){ cFunc() }) //cFunc() doesn't run
function bFunc(i){
return new Promise(function(resolve,reject){
var imgPath = __dirname + "/image1" + i + ".png";
fs.readFile(imgPath, function(err, imagebuffer){
if (err) throw err;
console.log(i)
if (i<1) {
i++;
return bFunc(i);
} else {
resolve();
};
});
})
}
function cFunc(){
console.log("End");
}
尝试 2: 在这种情况下,我使用了一个 for 循环,但它的执行是乱序的。控制台打印:结束,bFunc 完成,bFunc 完成
var fs = require('fs');
bFunc()
.then(function(){ cFunc() })
function bFunc(){
return new Promise(function(resolve,reject){
function read(filepath) {
fs.readFile(filepath, function(err, imagebuffer){
if (err) throw err;
console.log("bFunc done")
});
}
for (var i=0; i<2; i++){
var imgPath = __dirname + "/image1" + i + ".png";
read(imgPath);
};
resolve()
});
}
function cFunc(){
console.log("End");
}
提前感谢您的帮助!
【问题讨论】:
-
在尝试 1 中,
bFunc的错误处理程序在哪里?如果抛出错误,您将永远无法使用当前代码了解它。 -
这段代码的目标是什么?请用文字描述您试图解决的问题,而不是仅仅向我们展示无法满足您的需求的代码。您的代码有很多问题,所以我宁愿从了解要解决的问题开始,也不愿在不知道实际最终目标的情况下尝试修改代码中的所有错误。
-
@nils 它不会在 bFunc 上抛出错误!但我想我应该在链的末端放一个陷阱。
-
@jfriend00 我去掉了代码的所有细节,只留下结构来简化它。问题是一样的,但如果有帮助的话,我使用微软的牛津项目进行面部检测,然后在每个“.then”中我用眼镜、帽子等来增加照片。我可以与你分享源代码。谢谢。
-
好吧,从我们的角度考虑。您给了我们两个不起作用的代码块,并询问我们如何修复它们。但是,您永远不会真正描述他们应该做什么(正确的行为是什么)。我们是否应该从故障代码中猜测正确的行为是什么?请描述您希望从任一代码块中获得的所需和适当的行为。