我有下面的代码排队起来,并调用异步功能之一。然后,我需要如何确保addMessage不是并行调用?处理输入事件,通过一个
0
A
回答
0
可以按下Promise
或函数返回到Promise
阵列。如果当前Promise
或返回Promise
没有定义函数,调用在阵列队列第一功能,链.then()
调度来电时当前异步操作完成相同的功能,其中,在队列的下一个项目是在阵列的下一个项目,否则呼叫功能时队列阵列.length
是0
。
window.onload =() => {
const [queue, input, div] = [
Array()
, document.querySelector("input")
, document.querySelector("div")
];
let curr;
const complete = message => {
curr = void 0;
console.log(`message: ${message}, queue.length: ${queue.length}`);
};
const processData = data => div.innerHTML += data;
const checkQueue = (message = "done") =>
curr() // `curr()` if pass function to `queue`, `curr` if pass `Promise`
.then(processData)
.then(() => (curr = queue.shift()) ? checkQueue(message) : message)
const handleMessage = value => {
queue.push(
// push function to call that returns `Promise`
// or push `Promise`, remove `() =>`,
// include `()` after `curr` at `checkQueue`
() => new Promise(resolve =>
setTimeout(() => {
resolve(value);
}, Math.floor(Math.random() * 1500))
)
);
if (!curr) {
curr = queue.shift();
checkQueue("complete")
// do stuff when `queue` `.length` is `0`
.then(complete);
}
}
input.oninput =() => {
console.log(input.value.slice(-1));
handleMessage(input.value.slice(-1));
}
}
<input type="text" />
<div></div>
凡this.addMessage()
回报Promise
或返回Promise
database.ref('chats/').on('child_added',(snapshot) => {
handleMessage(this.addMessage(snapshot.val()));
});
0
我发现了一个简单的解决方案感谢您输入的功能:
var queue = Promise.resolve();
database.ref('chats/' + this.props.alarm.date).on('child_added',
(snapshot) => {
queue = queue.then(()=> {
this.addMessage(snapshot.val());
});
});
相关问题
- 1. 通过事件处理插入图像?
- 2. 正确处理输入更改事件
- 3. 文本输入事件处理
- 4. 通过executorservice处理顺序事件
- 5. 防止事件通过删除和恢复的事件处理程序处理
- 6. 处理聊天输入或停止输入事件(Android)
- 7. 通过批处理文件检查输入
- 8. 通用事件处理
- 9. 处理从单个输入元素通过POST上传的多个文件
- 10. 如何使用XSLT通过读取和处理多个输入xml来生成一个输出xml文件
- 11. Swift输入和故事板事件处理
- 12. 多个输入文件处理
- 13. 多个控件单击由一个事件处理的事件
- 14. 输入文件空处理
- 15. React对不同的输入使用一个事件处理程序
- 16. 两个AlertDialog,onCancel和“尝试完成一个输入事件,但输入事件接收器已被处置。”
- 17. 处理Node.js中的下一个事件
- 18. 在另一个类中处理事件
- 19. 3 linkbuttons一个事件处理程序
- 20. JS中输入掩码插件的事件处理程序
- 21. 传递的输入和输出通过一个父组件
- 22. GWT多个事件处理
- 23. 如何通过输入一个日期
- 24. PyQt,Qt,一个事件处理程序,处理很多项目
- 25. 在一个处理程序中处理所有事件?
- 26. 处理事件
- 27. 处理事件
- 28. NodeJS。 Child_process.spawn。处理过程'输入提示
- 29. 试图完成一个输入事件,但输入事件接收器已被处置错误
- 30. MapReduce一对多处理多个输入文件
不'。方法addMessage()'调用返回一个值? – guest271314
如果需要,我可以实现addMessage以返回承诺。 – MagnusR
请参阅http://stackoverflow.com/questions/26859275/make-a-jquery-function-wait-till-its-previous-call-has-been-resolved/。前段时间组建了一个不使用jQuery的版本;必须找到。 – guest271314