我有下面的代碼排隊起來,並調用異步功能之一。然後,我需要如何確保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. 將兩個事件處理組合成一個事件處理
- 5. DataGridView「輸入」鍵事件處理
- 6. 文本輸入事件處理
- 7. jquery .val()不能處理'輸入'事件?
- 8. 正確處理輸入更改事件
- 9. 處理輸入文本更改事件
- 10. 輸入一個批處理文件並將該輸入輸出到另一個批處理文件
- 11. 通過executorservice處理順序事件
- 12. 通過事件處理程序參數
- 13. GtkOverlay不通過輸入事件
- 14. 通過flash事件更改輸入值
- 15. 防止事件通過刪除和恢復的事件處理程序處理
- 16. 通過事件處理程序將值插入表
- 17. 處理聊天輸入或停止輸入事件(Android)
- 18. 通過批處理文件檢查輸入
- 19. 通過批處理文件給Java輸入
- 20. 通用事件處理
- 21. 爲什麼我的事件處理程序只輸入一次?
- 22. 處理從單個輸入元素通過POST上傳的多個文件
- 23. 當輸入存在於* ngIf =「someData」時,如何通過ngAfterViewInit()添加事件處理程序來輸入?
- 24. 處理許多輸入文件並通過awk分隔許多輸出文件
- 25. 如何統一處理輸入文件
- 26. 如何使用XSLT通過讀取和處理多個輸入xml來生成一個輸出xml文件
- 27. 通過10重複處理500個事件10?
- 28. 通過Kinetic.js中的多個層來處理事件?
- 29. Swift輸入和故事板事件處理
- 30. 多個輸入文件處理
不'。方法addMessage()'調用返回一個值? – guest271314
如果需要,我可以實現addMessage以返回承諾。 – MagnusR
請參閱http://stackoverflow.com/questions/26859275/make-a-jquery-function-wait-till-its-previous-call-has-been-resolved/。前段時間組建了一個不使用jQuery的版本;必須找到。 – guest271314