gpt4 book ai didi

javascript - 使用 setInterval 定期调用 Promise 驱动的函数并对其结果进行操作

转载 作者:行者123 更新时间:2023-12-02 21:10:15 26 4
gpt4 key购买 nike

我的目标是制作一个在特定时间运行的视频播放列表生成器,以及运行的时钟和许多其他定期运行的东西,但是我陷入了它在特定时间生成播放列表的部分我定义

我正在使用 FileHound 来遍历文件夹,只要我调用 find() 方法,它就会起作用,但由于它是 Promise 驱动的,因此它的结果不容易被以下内容使用例如,console.log()。同样的情况也发生在 MediaInfo() 上,但是这次我能够使用 async/await 来解决这个问题,据我所知,这是使用 async/await 的实际方法。基于 Promise 的函数。

现在,据我所知, .each().then() 方法链接是使用 Promise 驱动函数的结果的方法,但是每次我想在不同的地方做同样的事情时,这很快就会导致代码重复。

总而言之,我认为我已经偏离了自己的轨道,尽管我付出了努力,但我似乎找不到一个明确的方法来实现我想要的,所以我寻求帮助。这是我到目前为止的代码,我正在使用以下 npm 包:

  • 节点媒体信息
  • 文件猎犬
  • 时刻
const MediaInfo = require("node-mediainfo");
const Path = require("path");
const FileHound = require("filehound");
const Moment = require("moment");

const START_TIME = Moment();
const END_TIME = null;
const VIDEO_PATH = "videos";

let files = FileHound.create()
.path(VIDEO_PATH)
.depth(0);
let playlist = [];
let start_time = START_TIME.add(10, "seconds");

const ArrayShuffle = (array) => {
for (let i = array.length - 1; i > 0; i--) {
let j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
};

const MakePlaylist = async (file) => {
let fileinfo = await MediaInfo(Path.resolve(file));
let duration = fileinfo.media.track[0].Duration;
let title = fileinfo.media.track[0].Title || Path.basename(file, Path.extname(file));
let artist = fileinfo.media.track[0].Performer || null;

playlist.push({
path : Path.resolve(file),
title : title,
artist : artist,
duration: duration
});
};

console.log(start_time.toLocaleString());

/* Main Loop */
setInterval(() => {
if (Moment().isSame(start_time)) {
console.log("First Run");
files.find().each(MakePlaylist).then(ArrayShuffle);
console.log(playlist);
}

if (Moment().isSame(Moment(start_time).add(30, "seconds"))) {
console.log("Second Run");
playlist = [];
files.find().each(MakePlaylist).then(ArrayShuffle);
console.log(playlist);
}
}, 1);

最佳答案

我很想将您的逻辑放入async函数中,利用await。然后稍后调用您的函数,而不是尝试在 setTimeout

中执行它

假设files.find()返回一个 promise ....

const GeneratePlaylist = async () => {
var files = await files.find();
var playlist = [];
for(var i=0;i<files.length;i++){
playlist.push(await MakePlaylist(files[i]));
}
ArrayShuffle(playlist);
return playlist;
}

然后您可以从另一个async函数中使用它,并且您可以在1毫秒后使用setTimeout调用它(注意,您应该使MakePlaylist返回新项目,而不是推送到全局数组):

const doMyThing = async (){
if (Moment().isSame(start_time)) {
console.log("First Run");
playlist = await GeneratePlaylist();
console.log(playlist);
}

if (Moment().isSame(Moment(start_time).add(30, "seconds"))) {
console.log("Second Run");
playlist = [];
playlist = await GeneratePlaylist();
console.log(playlist);
}

setTimeout(doMyThing,1);
}

下面是一个工作示例,我刚刚使用 Promises 伪造了一些功能来模拟异步工作,例如查找文件和加载媒体信息:

const ArrayShuffle = (array) => {
for (let i = array.length - 1; i > 0; i--) {
let j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
};

const MakePlaylist = async (file) => {
let fileinfo = await new Promise(resolve => setTimeout(() => resolve({media:{track:[{Duration:1,Title:"Title",Performer:"Foo"}]}}),1000));
let duration = fileinfo.media.track[0].Duration;
let title = fileinfo.media.track[0].Title || Path.basename(file, Path.extname(file));
let artist = fileinfo.media.track[0].Performer || null;

return{
path : file,
title : title,
artist : artist,
duration: duration
};
};

const findFileMockup = () => {
return new Promise(resolve => setTimeout(() => {
resolve(["file1.txt","file2.txt","file3.txt"]);
},500));
}

const GeneratePlaylist = async () => {
var files = await findFileMockup(); // await files.find() in your code
var playlist = [];
for(var i=0;i<files.length;i++){
playlist.push(await MakePlaylist(files[i]));
}
ArrayShuffle(playlist);
return playlist;
}

const test = async () => {

var playlist = await GeneratePlaylist();
console.log(playlist);

}

test();

关于javascript - 使用 setInterval 定期调用 Promise 驱动的函数并对其结果进行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61116770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com