我试图使用" Promise"形成一个产生对象的数组。在我的服务器端,但是在将总对象推送到该数组之后,数组没有打印,它显示一个空数组
var Promise = require('bluebird'),
hh = require('http-https')
mongoose = require('mongoose'),
collection = mongoose.model('Collection');
function getInValidImgUrl(prodObj){
return new Promise((resolve, reject) => {
hh.get(prodObj.imageUrl, function (res) {
if (res.statusCode !== 200) {
/* console.log("IN HHHHH : " + res.statusCode);*/
resolve({
type: 'success',
ImgUrl: prodObj.imageUrl
})
}
}).on('error', function (e) {
// console.error(e);
resolve({
type: 'error',
ImgUrl: prodObj.imageUrl
})
});
})
};
exports.sampleFunc=function(){
collection.find({category:"electronics"}).exec(function(err,products){
if(err){
console.log(err)
}else{
var imgArr=[];
//eg:products=[{name:"mobile",imageUrl:"http://somepic.jpg"}]
for(var i=0; i<products.length: i++){
var calback = getInValidImgUrl(products(i));
calback.then(function(result){
imgArr.push(result);
console.log(JSON.stringify(imgArr)); // In this it showing every object is pushing into imgArr
})
}
Promise.all(imgArr).then(results =>{
console.log("IAMGE ARRAY :"+JSON.stringify(results)); //here iam not getting array it is showing an empty array
})
}
});
}
我可能知道我在哪里犯了一个错误,以及为什么它不打印整个数组。
非常感谢
答案 0 :(得分:1)
getInValidImgUrl
是异步的。返回结果后,回调中会填充imgArr
。
在返回所有先前的http请求承诺之前,您的promise.all
正在执行。
尝试:
var calback=[];
for(var i=0; i<products.length: i++){
calback[i] = getInValidImgUrl(products(i));
}
Promise.all(calback).then(results =>{
console.log("IAMGE ARRAY :"+JSON.stringify(results));
})