attempt to yield across a C-call boundary
Skrypt próbował czekać w miejscu, w którym czekanie jest niedozwolone. To błąd w kodzie, a nie w konfiguracji.
Zrób najpierw to
Tu potrzebna jest zmiana w kodzie tego skryptu — autor albo programista musi przenieść czekającą część.
Co to znaczy
Kod spróbował zaczekać w miejscu, którego nie da się wstrzymać. Lua potrafi zawiesić tylko własne ramki; kiedy łańcuch wywołań przechodzi akurat przez kod natywny (C++), nie ma czego zawieszać, więc czekanie jest nielegalne.
Co to powoduje
Uszeregowane według tego, jak często są odpowiedzią.
- 1
Wait albo await wewnątrz komparatora table.sort
table.sortjest natywne. Cokolwiek robi komparator, musi wrócić natychmiast. - 2
Czekanie wewnątrz funkcji zamieniającej w string.gsub
Też natywne.
- 3
Czekanie wewnątrz callbacku NUI
Handlery
RegisterNUICallbackmuszą wywołaćcb()i wrócić; oczekiwanie na zapytanie w środku trafia na to na części buildów. - 4
Czekanie wewnątrz pcall na starszej Lua
Lua 5.4 pozwala oddawać sterowanie przez pcall, ale starsze środowiska i część opakowań natywnych nie.
- 5
Czekanie wewnątrz handlera zmiany state baga
Te są wywoływane z warstwy natywnej.
Jak poznać, który jest twój
Traceback nazywa ramkę natywną. Zadaj wadliwej linii prostsze pytanie: czy jest wewnątrz funkcji, którą przekazałem czemuś innemu? Jeśli tak, to jest ta granica.
Gdzie szukać
Funkcja przekazana jako argument w wadliwej linii albo powyżej niej.
Jak to naprawić
Czekaj na zewnątrz, a callback trzymaj synchronicznym:
-- źle
RegisterNUICallback('buy', function(data, cb)
local rows = MySQL.query.await('SELECT ...') -- granica
cb(rows)
end)
-- dobrze
RegisterNUICallback('buy', function(data, cb)
cb({ ok = true }) -- odpowiedz natychmiast
CreateThread(function() -- a potem rób wolną robotę
local rows = MySQL.query.await('SELECT ...')
SendNUIMessage({ action = 'result', rows = rows })
end)
end)Wciąż utknąłeś na własnym kodzie?
Ta strona mówi, co ten błąd zwykle oznacza. Wklej swoją konsolę do Server Fixera, a uszereguje wszystko, co w niej jest, i powie, co zrobić najpierw; a jeśli wolisz tego nie ruszać, ORBIE naprawi skrypt i odda ci zasób gotowy do wrzucenia.
bug_reportOtwórz Server FixerDla tego rodzaju błędu Script Optimizer czyta skrypt i naprawia kod stojący za tym.