tentativa de yield através de um limite de chamada em C
Um script tentou esperar num lugar onde esperar não é permitido. É um erro de programação, não de configuração.
Faça isto primeiro
Isso precisa de mudança de código naquele script: o autor ou um desenvolvedor tem que mover a parte que espera.
O que significa
O código tentou esperar dentro de um lugar que não pode ser pausado. O Lua só consegue suspender os próprios quadros; quando a cadeia de chamadas passa naquele momento por código nativo (C++), não há nada para suspender, então a espera é ilegal.
O que causa isso
Ordenado pela frequência com que é a resposta.
- 1
Um Wait ou um await dentro de um comparador de table.sort
table.sorté nativo. Tudo o que o comparador faz precisa retornar imediatamente. - 2
Esperar dentro de uma função de substituição de string.gsub
Também é nativo.
- 3
Esperar dentro de um callback da NUI
Os handlers de
RegisterNUICallbackprecisam chamarcb()e retornar; esperar uma consulta dentro de um esbarra nisso em algumas versões. - 4
Esperar dentro de pcall num Lua mais antigo
O Lua 5.4 permite ceder o controle através do pcall, mas os runtimes mais antigos e alguns wrappers nativos não.
- 5
Esperar dentro de um handler de mudança de state bag
Esses são invocados pela camada nativa.
Como saber qual é o seu
O rastro nomeia o quadro nativo. Faça uma pergunta mais simples à linha que falha: ela está dentro de uma função que eu passei para outra coisa? Se sim, ali está a fronteira.
Onde olhar
A função passada como argumento na linha que falha ou acima dela.
Como consertar
Faça a espera fora, e mantenha o callback síncrono:
-- errado
RegisterNUICallback('buy', function(data, cb)
local rows = MySQL.query.await('SELECT ...') -- fronteira
cb(rows)
end)
-- certo
RegisterNUICallback('buy', function(data, cb)
cb({ ok = true }) -- responda na hora
CreateThread(function() -- e depois faça o trabalho lento
local rows = MySQL.query.await('SELECT ...')
SendNUIMessage({ action = 'result', rows = rows })
end)
end)Ainda travado no seu próprio código?
Esta página é o que esse erro costuma significar. Cole o seu console no Server Fixer e ele vai ordenar tudo o que estiver lá e te dizer o que fazer primeiro; e se você preferir não mexer, o ORBIE consegue consertar o script e te devolver o resource pronto para soltar.
bug_reportAbrir o Server FixerPara esse tipo de erro, o Script Optimizer lê o script e conserta o código por trás disso.