我下面有一个函数,目的是在本地目录中查找图像并自动发布到twitter上。如果照片以前已经上传过,我不想重新上传。
function random_from_array(images){
return images[Math.floor(Math.random() * images.length)];
}
使用random_from_array函数的函数。
function upload_random_image(images){
console.log('Opening an image...');
var image_path = path.join(__dirname, '/images/' + random_from_array(images)),
b64content = fs.readFileSync(image_path, { encoding: 'base64' });
console.log('Uploading an image...');
T.post('media/upload', { media_data: b64content }, function (err, data, response) {
if (err){
console.log('ERROR:');
console.log(err);
}
else{
console.log('Image uploaded!');
console.log('Now tweeting it...');
T.post('statuses/update', {
media_ids: new Array(data.media_id_string)
},
function(err, data, response) {
if (err){
console.log('ERROR:');
console.log(err);
}
else{
console.log('Posted an image!');
}
}
);
}
});
}
到目前为止,它只是从传入的数组参数中选择一个随机数,但我想知道是否有任何方法可以在每次调用它时以下面的方式返回。每当我试图循环并返回每次迭代时,它只会给我第一次迭代,肯定会导致返回停止它
return images[0]
return images[1] //Next Invocation
return images[2] //Next Invocation...
我正在学习本教程https://botwiki.org/resource/tutorial/random-image-tweet/#posting-图像
提前感谢你的帮助,我陷入困境了。
如果您可以更改调用代码的结构,请考虑使用更高阶的函数:用images
数组调用一次,它会返回一个函数,当调用时,该函数会返回数组中的下一个元素:
const makeIterFn = images => () => images.shift();
然后称之为:
const iterFn = makeIterFn(arrOfImages);
iterFn(); // first item in array
iterFn(); // second item in array
如果你想避免改变参数,首先slice
:
const makeIterFn = (images) => {
const imagesCopy = images.slice();
return () => imagesCopy.shift();
};
您也可以使用内置的数组迭代器-而不是random_from_array
,调用数组的Symbol.iterator
为其获取迭代器,然后调用其next()
方法来获取数组中的下一项:
const iterator = arrOfImages[Symbol.iterator]();
iterator.next().value // first image
iterator.next().value // second image
如果这是在一个循环中完成的,如果可能的话,使用for (const image of arrOfImages) {
可能更有意义,但没有足够的上下文可以确定。