每次调用函数时可以返回不同的值吗?-JavaScript



我下面有一个函数,目的是在本地目录中查找图像并自动发布到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) {可能更有意义,但没有足够的上下文可以确定。

最新更新