THE ORB
Uruchamiam studio

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.

groupsTa funkcja przestaje działaćcodePotrzebny programista

Zrób najpierw to

Tu potrzebna jest zmiana w kodzie tego skryptu — autor albo programista musi przenieść czekającą część.

bug_reportWklej zamiast tego całą konsolę

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. 1

    Wait albo await wewnątrz komparatora table.sort

    table.sort jest natywne. Cokolwiek robi komparator, musi wrócić natychmiast.

  2. 2

    Czekanie wewnątrz funkcji zamieniającej w string.gsub

    Też natywne.

  3. 3

    Czekanie wewnątrz callbacku NUI

    Handlery RegisterNUICallback muszą wywołać cb() i wrócić; oczekiwanie na zapytanie w środku trafia na to na części buildów.

  4. 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. 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 Fixer

Dla tego rodzaju błędu Script Optimizer czyta skrypt i naprawia kod stojący za tym.

Błędy, które chodzą z tym w parze