NUI callbacks

NUI还可以使用所谓的’NUI 回调’将调用发送回游戏。目前只有在 Lua,可以使用其他语言,但需要一些tricky workaround,因为这些是预先设置的函数 codegen中的引用。

通常,您将在Lua中使用RegisterNUICallback函数, REGISTER_NUI_CALLBACK_TYPE 本机以及其他语言的事件处理程序。

两者的工作原理非常相似,我们将在下面描述两者:

Registering a NUI callback in Lua

RegisterNUICallback('getItemInfo', function(data, cb)
    -- POST数据自动解析为JSON
    local itemId = data.itemId

    if not itemCache[itemId] then
        cb({ error = 'No such item!' })
        return
    end

    -- 回调响应数据也是
    cb(itemCache[itemId])
end)

Registering a NUI callback in C#/JS

// JS
RegisterNuiCallbackType('getItemInfo') // 注册类型

// 注册事件名称
on('__cfx_nui:getItemInfo', (data, cb) => {
    const itemId = data.itemId;

    if (!itemCache[itemId]) {
        cb({ error: 'No such item!' });
        return;
    }

    cb(itemCache[itemId]);
});
// C#
RegisterNuiCallbackType("getItemInfo"); // 注册类型

// register the event handler with manual marshaling
EventHandlers["__cfx_nui:getItemInfo"] += new Action<IDictionary<string, object>, CallbackDelegate>((data, cb) =>
{
    // 从对象获取itemId
    // 或者,您可以使用“dynamic”并依赖于DLR
    if (data.TryGetValue("itemId", out var itemIdObj))
    {
        cb(new 
        {
            error = "Item ID not specified!"
        });

        return;
    }

    // cast away
    var itemId = (itemIdObj as string) ?? "";

    // same as above
    if (!ItemCache.TryGetValue(itemId, out Item item))
    {
        cb(new 
        {
            error = "No such item!"
        });

        return;
    }

    cb(item);
});

Invoking the NUI callback

// browser-side JS
fetch(`https://${GetParentResourceName()}/getItemInfo`, {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json; charset=UTF-8',
    },
    body: JSON.stringify({
        itemId: 'my-item'
    })
}).then(resp => resp.json()).then(resp => console.log(resp));

为了防止请求暂停,您必须始终返回回调-即使只包含一个空的 对象,或{"ok":true},或类似的。