解决数组推送的承诺 - javascript



>我正在尝试定义一个返回承诺的函数。当设置给定数组时,承诺应该解析(push()(。

为此,我尝试使用代理对象(受此影响(:

let a = []
;(async function(){
const observe = array => new Promise(resolve =>
new Proxy(array, {
set(array, key, val) {
array[key] = val;
resolve();
}
}));
while(true){
await observe(a);
console.log(new Date().toLocaleTimeString(),"Blimey Guv'nor:",`${a.pop()}`);
}
})(a);
;(async function(){
await new Promise(resolve => timerID = setTimeout(resolve, 2000))
a.push('ʕ·͡ᴥ·ʔ');
a.push('¯(°_o)/¯ ')
})(a)

我不明白为什么这不起作用。有人知道吗?

更一般地说,在推送到阵列时解析承诺的好方法是什么?

您的尝试问题:

  • 您在原始数组上调用.push,而不是代理数组。在创建代理的地方,它不会返回给任何人:对它的任何引用都将丢失(并且将被垃圾回收(。
  • await行后面的代码将异步执行,因此在所有push调用都已执行之后。这意味着当数组已经有两个元素时,console.log将执行。因此,承诺不是您想要的正确工具,因为只有在所有其他同步代码都运行完成时,才能对承诺的解析进行操作。要在执行期间同步获取通知,您需要一个同步解决方案,而承诺基于异步执行。

为了完成答案,我在这里提供了一个简单的同步回调解决方案:

function observed(array, cb) {
return new Proxy(array, {
set(array, key, val) {
array[key] = val;
if (!isNaN(key)) cb(); // now it is synchronous
return true;
}
});
}
let a = observed([], () =>
console.log(new Date().toLocaleTimeString(),"Blimey Guv'nor:", `${a.pop()}`)
);
a.push('ʕ·͡ᴥ·ʔ');
a.push('¯(°_o)/¯ ');

如前所述:当您需要同步代码执行时,promise 不是正确的工具。

异步执行每个push

如果您确定每个push都发生在单独的任务中,则可以使用承诺,其中承诺作业队列在每对push调用之间进行处理。

例如,如果将每个push调用作为输入事件处理程序的一部分,或作为setTimeout计时器的回调,则可能:

function observed(array) {
let resolve = () => null; // dummy
let proxy = new Proxy(array, {
set(array, key, val) {
array[key] = val;
if (!isNaN(key)) resolve();
return true;
}
});
proxy.observe = () => new Promise(r => resolve = r);
return proxy;
}
let a = observed([]);
(async () => {
while (true) {
await a.observe();
console.log(new Date().toLocaleTimeString(),"Blimey Guv'nor:",`${a.pop()}`);
}
})();
setTimeout(() => a.push('ʕ·͡ᴥ·ʔ'), 100);
setTimeout(() => a.push('¯(°_o)/¯ '), 100);

最新更新