js 一个promise数组且该数组会随时添加新promise,要怎么样一个一个同步执行
有可能执行完一个promise过一会才会添加新的
来个骚操作,用异步迭代器做promise队列(建议看懂了再用,目前没法在每次next时拿到任务执行的promise,等function.sent提案)
const sleep = async (time) => { console.log('start task', time, Date.now()); return new Promise((resolve) => setTimeout(() => { console.log('resolve', time, Date.now()); resolve(true); }, time), );};async function* promiseQueue() { while (1) await (yield)();}const pmsQueue = promiseQueue();pmsQueue.next(() => Promise.resolve(true)); // 第一次会被忽略,等function.sent提案console.log('start:', Date.now());pmsQueue.next(() => sleep(3000));pmsQueue.next(() => sleep(5000));pmsQueue.next(() => sleep(8000));/*start: 1699617365646start task 3000 1699617365646resolve 3000 1699617368656start task 5000 1699617368657resolve 5000 1699617373666start task 8000 1699617373667resolve 8000 1699617381675*/
粗略的设计,弄个定时器,定义个全局promise数组,然后再弄个循环定时器 setInterval 不断读取这个全局数组进行执行,理论上是没问题,但是细节需要打磨
原生不支持,自己控制 promise 就行了。
先写期待的用法:
// 主进程const myPromiseAll = new MyPromiseAll([...启动时的异步操作]);await myPromiseAll.promise;// 继续其它操作// 事件函数function onClick() { myPromiseAll.add(新异步操作);}
然后简单实现一下 MyPromiseAll
这个类:
class myPromiseAll( promise; #tasks = 0; #count = 0; #resolve; #reject; constructor(tasks) { for (const task of tasks) { this.add(task); } this.promise = new Promise((resolve, reject) => { this.#resolve = resolve; this.#reject = reject; }); } add(task) { task.then(() => { this.#count++; if (this.#count >= this.#tasks) { this.#resolve(); } }).catch(err => { // this.#reject(); }); this.#tasks++; }}
没测,你自己根据需求改改吧。
对不起,这个问题存在误解。JavaScript中的Promise对象是用于处理异步操作,它们不是按照顺序一个接一个地执行的。相反,Promise是并行执行的,这意味着一旦你创建了多个Promise,它们将同时开始执行。
如果你希望Promise按照特定的顺序执行,你需要使用.then()
函数或者async/await
语法来确保前一个Promise在后一个Promise开始之前完成。但是,请注意,这不会阻止并行执行,只会确保在每个Promise完成后按顺序执行下一个Promise。
这里是一个基本的例子:
let promise1 = new Promise((resolve, reject) => { setTimeout(resolve, 1000, 'promise1 completed');});let promise2 = new Promise((resolve, reject) => { setTimeout(resolve, 2000, 'promise2 completed');});let promise3 = new Promise((resolve, reject) => { setTimeout(resolve, 3000, 'promise3 completed');});promise1.then(result1 => { console.log(result1); // 'promise1 completed' return promise2;}).then(result2 => { console.log(result2); // 'promise2 completed' return promise3;}).then(result3 => { console.log(result3); // 'promise3 completed'});
在这个例子中,尽管promise1
、promise2
和promise3
几乎同时开始,但promise1
会首先完成,然后是promise2
,最后是promise3
。这就是通过.then()
函数实现的Promise的顺序执行。
然而,如果你想在添加新的Promise时保持顺序,你可能需要一种不同的设计模式。你可能需要创建一个队列,每当一个新Promise完成时,就将新的Promise添加到队列的末尾。然后,你可以遍历这个队列并依次执行每个Promise。这种方法比较复杂,可能需要你自己去实现。
我有一个需要在循环中执行的请求promise,比如: 问题是我永远不知道数组中有多少元素,所以我需要一个动态模式。有没有可能混合同步和异步世界,以便在一个时刻只有一个请求是活动的(序列不重要)?
考虑以下代码: 这是我得到的输出: 但是如果我把代码改成这样: 我会得到这个: 我很困惑,因为根据文档,应该暂停执行,直到promise得到解决。在这种情况下,第一个示例应该以数组的形式返回
我试图利用es7异步功能,即。 在这里,所有promise*函数都进行ajax调用,并返回或如果ajax响应满足传递的参数,我相信我不能连续使用3个等待,因此需要一种方法来等待所有这些调用以某种方式返回它们的值。
本文向大家介绍怎么定时更新一个组件?相关面试题,主要包含被问及怎么定时更新一个组件?时的应答技巧和注意事项,需要的朋友参考一下 Creating a timer in , and recycle it in . For react hooks, creating a timer in useEffect function with as the useEffect check condition
我想要这样的结果。依靠这个数组,我想在其中得到一个随机值。