UNPKG

@formily/reactive

Version:

> Web Reactive Library Like Mobx

155 lines 5.29 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.reaction = exports.autorun = void 0; var reaction_1 = require("./reaction"); var checkers_1 = require("./checkers"); var environment_1 = require("./environment"); var array_1 = require("./array"); var autorun = function (tracker, name) { if (name === void 0) { name = 'AutoRun'; } var reaction = function () { if (!(0, checkers_1.isFn)(tracker)) return; if (reaction._boundary > 0) return; if (environment_1.ReactionStack.indexOf(reaction) === -1) { (0, reaction_1.releaseBindingReactions)(reaction); try { (0, reaction_1.batchStart)(); environment_1.ReactionStack.push(reaction); tracker(); } finally { environment_1.ReactionStack.pop(); reaction._boundary++; (0, reaction_1.batchEnd)(); reaction._boundary = 0; reaction._memos.cursor = 0; reaction._effects.cursor = 0; } } }; var cleanRefs = function () { reaction._memos = { queue: [], cursor: 0, }; reaction._effects = { queue: [], cursor: 0, }; }; reaction._boundary = 0; reaction._name = name; cleanRefs(); reaction(); return function () { (0, reaction_1.disposeBindingReactions)(reaction); (0, reaction_1.disposeEffects)(reaction); cleanRefs(); }; }; exports.autorun = autorun; exports.autorun.memo = function (callback, dependencies) { if (!(0, checkers_1.isFn)(callback)) return; var current = environment_1.ReactionStack[environment_1.ReactionStack.length - 1]; if (!current || !current._memos) throw new Error('autorun.memo must used in autorun function body.'); var deps = (0, array_1.toArray)(dependencies || []); var id = current._memos.cursor++; var old = current._memos.queue[id]; if (!old || (0, reaction_1.hasDepsChange)(deps, old.deps)) { var value = callback(); current._memos.queue[id] = { value: value, deps: deps, }; return value; } return old.value; }; exports.autorun.effect = function (callback, dependencies) { if (!(0, checkers_1.isFn)(callback)) return; var current = environment_1.ReactionStack[environment_1.ReactionStack.length - 1]; if (!current || !current._effects) throw new Error('autorun.effect must used in autorun function body.'); var effects = current._effects; var deps = (0, array_1.toArray)(dependencies || [{}]); var id = effects.cursor++; var old = effects.queue[id]; if (!old || (0, reaction_1.hasDepsChange)(deps, old.deps)) { Promise.resolve(0).then(function () { if (current._disposed) return; var dispose = callback(); if ((0, checkers_1.isFn)(dispose)) { effects.queue[id].dispose = dispose; } }); effects.queue[id] = { deps: deps, }; } }; var reaction = function (tracker, subscriber, options) { var realOptions = __assign({ name: 'Reaction' }, options); var value = {}; var dirtyCheck = function () { if ((0, checkers_1.isFn)(realOptions.equals)) return !realOptions.equals(value.oldValue, value.currentValue); return value.oldValue !== value.currentValue; }; var fireAction = function () { try { //如果untrack的话,会导致用户如果在scheduler里同步调用setState影响下次React渲染的依赖收集 (0, reaction_1.batchStart)(); if ((0, checkers_1.isFn)(subscriber)) subscriber(value.currentValue, value.oldValue); } finally { (0, reaction_1.batchEnd)(); } }; var reaction = function () { if (environment_1.ReactionStack.indexOf(reaction) === -1) { (0, reaction_1.releaseBindingReactions)(reaction); try { environment_1.ReactionStack.push(reaction); value.currentValue = tracker(); } finally { environment_1.ReactionStack.pop(); } } }; reaction._scheduler = function (looping) { looping(); if (dirtyCheck()) fireAction(); value.oldValue = value.currentValue; }; reaction._name = realOptions.name; reaction(); value.oldValue = value.currentValue; if (realOptions.fireImmediately) { fireAction(); } return function () { (0, reaction_1.disposeBindingReactions)(reaction); }; }; exports.reaction = reaction; //# sourceMappingURL=autorun.js.map