【发布时间】:2019-12-20 14:33:48
【问题描述】:
我写了下面的代码sn-p:
var data = require('./readFile.js');
const argv = require('./index.js');
const colors = require('colors');
const rp = require('request-promise').defaults({ encoding: null });
const memeImage = argv.name;
const path = './json/meme.json';
var myData;
data.readFile(path)
.then(function (value) {
var jsonData = JSON.parse(value);
const options = {
resolveWithFullResponse: true
}
jsonData.forEach(element => {
if(element.title == memeImage) {
rp.get(element.image, options)
.then(function(response){
if(response.statusCode == 200) {
myData = Buffer.from(response.body).toString('base64');
myData.replace('myData:image/png;base64,', '');
console.log(myData);
resolve(myData);
}
else {
console.log('Error in retrieving image. Status code: ', response.statusCode);
reject('Error in retrieving image.');
}
})
.catch(function(error){
console.log('Error in downloading the image via request()');
reject('Error in downloading the image via request()');
});
}
});
})
.then(function(myData) {
console.log(myData);
})
.catch(function(err) {
//Error in reading the file
console.log(err);
})
module.exports=myData;
这里,从另一个文件 (readFile.js) 导入的函数 readFile() 返回了一个承诺。 readFile.js如下:
var myData, obj, found=false;
function readFile(path) {
return new Promise(function(resolve, reject){
if(!fs.existsSync(path)) {
console.log('Will throw error now!');
reject("memes.json file does not exist");
}
else {
//File exists
console.log('File found');
var data = fs.readFileSync(path, 'utf8');
resolve(data);
}
})
}
module.exports.readFile = readFile;
现在在最上面的代码 sn-p 中,我的目标是使用 readFile.js 文件读取文件(将标题映射到 URL),然后在相应的 URL 下载图像。一旦找到这个匹配项(上面的 if 子句),promise 应该被解析并返回到一个新模块。
现在发生的是,我得到以下输出:
node ./lib/getImage.js -n title -t topText -b bottomText
找到文件
未定义
<...>
通过 request() 下载图像时出错
未处理的拒绝 ReferenceError: 拒绝未定义 ...
我的问题是,this 和 this 之类的答案都是关于从循环中返回多个承诺。就我而言,我只想返回一个 promise resolve(取决于匹配)然后停止。
我如何做到这一点?
谢谢!
【问题讨论】:
标签: javascript node.js promise