12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.makeWaitForNextTask = makeWaitForNextTask;
- /**
- * Copyright (c) Microsoft Corporation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- // See https://joel.tools/microtasks/
- function makeWaitForNextTask() {
- // As of Mar 2021, Electron v12 doesn't create new task with `setImmediate` despite
- // using Node 14 internally, so we fallback to `setTimeout(0)` instead.
- // @see https://github.com/electron/electron/issues/28261
- if (process.versions.electron) return callback => setTimeout(callback, 0);
- if (parseInt(process.versions.node, 10) >= 11) return setImmediate;
- // Unlike Node 11, Node 10 and less have a bug with Task and MicroTask execution order:
- // - https://github.com/nodejs/node/issues/22257
- //
- // So we can't simply run setImmediate to dispatch code in a following task.
- // However, we can run setImmediate from-inside setImmediate to make sure we're getting
- // in the following task.
- let spinning = false;
- const callbacks = [];
- const loop = () => {
- const callback = callbacks.shift();
- if (!callback) {
- spinning = false;
- return;
- }
- setImmediate(loop);
- // Make sure to call callback() as the last thing since it's
- // untrusted code that might throw.
- callback();
- };
- return callback => {
- callbacks.push(callback);
- if (!spinning) {
- spinning = true;
- setImmediate(loop);
- }
- };
- }
|