Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
者:西嵐
轉(zhuǎn)發(fā)鏈接:https://juejin.im/post/5dadd0236fb9a04de04d968e
市屬廣播電視和網(wǎng)絡(luò)視聽行業(yè)統(tǒng)計單位:
根據(jù)國家廣播電視總局相關(guān)要求,為確保2023年一季度廣播電視和網(wǎng)絡(luò)視聽統(tǒng)計工作順利進行,切實保障統(tǒng)計數(shù)據(jù)質(zhì)量和報送時效,更好地發(fā)揮統(tǒng)計對廣播電視和網(wǎng)絡(luò)視聽發(fā)展的數(shù)據(jù)支持和引導(dǎo)作用,現(xiàn)就一季度統(tǒng)計報表工作提出具體要求:
一、充分認識統(tǒng)計工作重要性,切實提高統(tǒng)計數(shù)據(jù)質(zhì)量
1.深化對統(tǒng)計工作重要性的認識。各廣播電視和網(wǎng)絡(luò)視聽統(tǒng)計填報單位要堅決貫徹落實黨的二十大、中央全面深化改革委員會第二十一次會議關(guān)于完善統(tǒng)計體制、發(fā)揮統(tǒng)計監(jiān)督職能、提高統(tǒng)計數(shù)據(jù)質(zhì)量、推進統(tǒng)計現(xiàn)代化改革的重大部署,認真學(xué)習(xí)貫徹執(zhí)行《關(guān)于更加有效發(fā)揮統(tǒng)計監(jiān)督職能作用的意見》《廣播電視行業(yè)統(tǒng)計管理規(guī)定》和《廣播電視和網(wǎng)絡(luò)視聽統(tǒng)計調(diào)查制度》,充分認識新時期廣播電視統(tǒng)計工作的重要性,增強做好統(tǒng)計工作的使命感和責(zé)任感,單位主要領(lǐng)導(dǎo)要親自過問,牢固樹立大局意識、責(zé)任意識、法制意識,強化部門之間的協(xié)作,保質(zhì)、保量完成廣播電視行業(yè)統(tǒng)計工作。
2.強化統(tǒng)計數(shù)據(jù)審核,建立初審、復(fù)審和復(fù)核制度。統(tǒng)計人員要嚴格按照《廣播電視和網(wǎng)絡(luò)視聽統(tǒng)計調(diào)查制度》要求填報統(tǒng)計數(shù)據(jù),在數(shù)據(jù)填報過程中要注意表內(nèi)、表間相關(guān)數(shù)據(jù)的邏輯關(guān)系,確保數(shù)據(jù)真實準確、不重不漏。各級匯總單位要強化報表數(shù)據(jù)審核,對每一項指標都要分區(qū)域、分單位認真進行同比、環(huán)比核對,并確保報表指標之間的邏輯關(guān)系準確。
3.防范懲治統(tǒng)計造假,全面提升數(shù)據(jù)質(zhì)量。堅決貫徹落實《防范和懲治統(tǒng)計造假、弄虛作假督察工作規(guī)定》《防范和懲治廣播電視和網(wǎng)絡(luò)視聽統(tǒng)計造假、弄虛作假責(zé)任制規(guī)定》文件精神,全面提升統(tǒng)計數(shù)據(jù)質(zhì)量。各單位要認真履行統(tǒng)計法定義務(wù)、主動提供真實情況,明確統(tǒng)計機構(gòu)和相關(guān)人員的主體責(zé)任,加強統(tǒng)計力量,配備專職或指定兼職統(tǒng)計人員,保持統(tǒng)計人員的相對穩(wěn)定,提高廣播電視和網(wǎng)絡(luò)視聽統(tǒng)計數(shù)據(jù)的真實性、準確性和完整性。
二、報送范圍
北京廣播電視臺及所屬單位、北京歌華傳媒集團有限責(zé)任公司及所屬單位、北京歌華有線電視網(wǎng)絡(luò)股份有限公司、區(qū)融媒體中心、局所屬事業(yè)單位、持有《廣播電視節(jié)目制作經(jīng)營許可證》和《信息網(wǎng)絡(luò)傳播視聽節(jié)目許可證》的機構(gòu)等。
三、報送時間
2023年4月10日前。
四、注意事項
1.登錄系統(tǒng)填報表,請確認報表類型為“2023年一季度”。
2.填報時請注意,上報數(shù)據(jù)為1-3月份的累計數(shù),收入指標計量單位為“萬元”。
3.廣基19表03欄企業(yè)總收入,04欄實際創(chuàng)收收入,兩項必須同時填報。03欄企業(yè)單位總收入=主營業(yè)務(wù)收入+其他業(yè)務(wù)收入+補助收入;實際創(chuàng)收收入為廣播電視和網(wǎng)絡(luò)視聽相關(guān)收入。
4.廣基19表22-23欄,沒有IPTV和OTT業(yè)務(wù)相關(guān)許可證的單位,請不要填寫。
5.廣基20-1和20-2是影視節(jié)目出口和服務(wù)貿(mào)易出口表,有相關(guān)業(yè)務(wù)按合同填報,沒有相關(guān)業(yè)務(wù)的單位不填此表,也不點擊保存上報(保持報表狀態(tài)為未填報)。
6.報表填報完畢后,需按附件2《季報說明對比模板》做說明和季度對比,并在直報系統(tǒng)“制度信息打印及文件上傳”模塊上傳一季度說明后,季報統(tǒng)計報送工作才全部完成。
五、相關(guān)咨詢電話
在報表編制、報送過程中,如遇指標解釋、填報口徑等問題,請與規(guī)劃發(fā)展處(產(chǎn)業(yè)促進處)聯(lián)系。
聯(lián)系電話:
010-86098124
010-86098054
QQ群號(廣電資質(zhì)G群):
621726350(申請入群請備注公司名稱)
附件1:季報報送操作流程
附件2:季報說明對比模板
官網(wǎng)鏈接:http://gdj.beijing.gov.cn/zwxx/tzgg2/202304/t20230404_2974588.html
文同步本人掘金平臺原創(chuàng)翻譯的文章:https://juejin.cn/post/6844903834246971400
你是否遇到過"callbacks"一詞,但是不知道這意味著什么?別著急。你不是一個人。許多JavaScript的新手發(fā)現(xiàn)回調(diào)也很難理解。
盡管callbacks可能令人疑惑,但是你仍然需要徹底了解它們,因為它們是JavaScript中的一個重要的概念。如果你不知道callbacks,你不可能走得很遠。
這就是今天的文章(要講的)!你將了解callbacks是什么,為什么它們很重要,以及如何使用它們。
備注:你會在這篇文章中看到ES6箭頭函數(shù)。如果你不是很熟悉它們,我建議你在往下讀之前復(fù)習(xí)一下ES6這篇文章(只了解箭頭函數(shù)部分就可以了)。
callback是作為稍后要執(zhí)行的參數(shù)傳遞給另一個函數(shù)的函數(shù)。(開發(fā)人員說你在執(zhí)行函數(shù)時“調(diào)用”一個函數(shù),這就是被命名為回調(diào)函數(shù)的原因)。
它們在JavaScript中很常見,你可能自己潛意識的使用了它們而不知道它們被稱為回調(diào)函數(shù)。
接受函數(shù)回調(diào)的一個示例是addEventLisnter:
const button = document.querySelector('button')
button.addEventListener('click', function(e) {
// Adds clicked class to button
this.classList.add('clicked')
})
復(fù)制代碼
看不出是回調(diào)函數(shù)嗎?那么,這種寫法怎樣?
const button = document.querySelector('button')
// Function that adds 'clicked' class to the element
function clicked (e) {
this.classList.add('clicked')
}
// Adds click function as a callback to the event listener
button.addEventListener('click', clicked)
復(fù)制代碼
在這里,我們告訴JavaScript監(jiān)聽按鈕上的click事件。如果檢測到點擊,則JavaScript應(yīng)觸發(fā)clicked函數(shù)。因此,在這種情況下,clicked是回調(diào)函數(shù),而addEventListener是一個接受回調(diào)的函數(shù)。
現(xiàn)在,你明白什么是回調(diào)函數(shù)了嘛?:)
我們來看另外一個例子。這一次,假設(shè)你希望通過過濾一組數(shù)據(jù)來獲取小于5的列表。在這里,你將回調(diào)函數(shù)傳遞給filter函數(shù):
const numbers = [3, 4, 10, 20]
const lesserThanFive = numbers.filter(num => num < 5)
復(fù)制代碼
現(xiàn)在,如果你想通過命名函數(shù)執(zhí)行上面的代碼,則過濾函數(shù)將如下所示:
const numbers = [3, 4, 10, 20]
const getLessThanFive = num => num < 5
// Passing getLessThanFive function into filter
const lesserThanFive = numbers.filter(getLessThanFive)
復(fù)制代碼
在這種情況下,getLessThanFive是回調(diào)函數(shù)。Array.filter是一個接受回調(diào)的函數(shù)。
現(xiàn)在明白為什么了吧?一旦你知道回調(diào)函數(shù)是什么,它們就無處不在!
下面的示例向你展示如何編寫回調(diào)函數(shù)和接受回調(diào)的函數(shù):
// Create a function that accepts another function as an argument
const callbackAcceptingFunction = (fn) => {
// Calls the function with any required arguments
return fn(1, 2, 3)
}
// Callback gets arguments from the above call
const callback = (arg1, arg2, arg3) => {
return arg1 + arg2 + arg3
}
// Passing a callback into a callback accepting function
const result = callbackAcceptingFunction(callback)
console.log(result) // 6
復(fù)制代碼
請注意,當(dāng)你將回調(diào)函數(shù)傳遞給另一個函數(shù)時,你只傳遞該函數(shù)的引用(并沒有執(zhí)行它,因此沒有括號())
const result = callbackAcceptingFunction(callback)
復(fù)制代碼
你只能在callbackAcceptingFunction中喚醒(調(diào)用)回調(diào)函數(shù)。執(zhí)行此操作時,你可以傳遞回調(diào)函數(shù)可能需要的任意數(shù)量的參數(shù):
const callbackAcceptingFunction = (fn) => {
// Calls the callback with three args
fn(1, 2, 3)
}
復(fù)制代碼
這些由callbackAcceptingFunction傳遞給回調(diào)函數(shù)的參數(shù),然后再通過回調(diào)函數(shù)(執(zhí)行):
// Callback gets arguments from callbackAcceptingFunction
const callback = (arg1, arg2, arg3) => {
return arg1 + arg2 + arg3
}
復(fù)制代碼
這是回調(diào)的解剖。現(xiàn)在,你應(yīng)該知道addEventListener包含一個event參數(shù):)
// Now you know where this event object comes from! :)
button.addEventListener('click', (event) => {
event.preventDefault()
})
復(fù)制代碼
唷!這是callbacks的基本思路!只需要記住其關(guān)鍵:將一個函數(shù)傳遞給另一個函數(shù),然后,你會想起我上面提到的機制。
旁注:這種傳遞函數(shù)的能力是一件很重要的事情。它是如此重要,以至于說JavaScript中的函數(shù)是高階函數(shù)。高階函數(shù)在編程范例中稱為函數(shù)編程,是一件很重大的事情。
但這是另一天的話題。現(xiàn)在,我確信你已經(jīng)開始明白callbacks是什么,以及它們是如何被使用的。但是為什么?你為什么需要callbacks呢?
回調(diào)函數(shù)以兩種不同的方式使用 -- 在同步函數(shù)和異步函數(shù)中。
如果你的代碼從上到下,從左到右的方式順序執(zhí)行,等待上一個代碼執(zhí)行之后,再執(zhí)行下一行代碼,則你的代碼是同步的。
讓我們看一個示例,以便更容易理解:
const addOne = (n) => n + 1
addOne(1) // 2
addOne(2) // 3
addOne(3) // 4
addOne(4) // 5
復(fù)制代碼
在上面的例子中,addOne(1)首先執(zhí)行。一旦它執(zhí)行完,addOne(2)開始執(zhí)行。一旦addOne(2)執(zhí)行完,addOne(3)執(zhí)行。這個過程一直持續(xù)到最后一行代碼執(zhí)行完畢。
當(dāng)你希望將部分代碼與其它代碼輕松交換時,回調(diào)將用于同步函數(shù)。
所以,回到上面的Array.filter示例中,盡管我們將數(shù)組過濾為包含小于5的數(shù)組,但你可以輕松地重用Array.filter來獲取大于10的數(shù)字數(shù)組:
const numbers = [3, 4, 10, 20]
const getLessThanFive = num => num < 5
const getMoreThanTen = num => num > 10
// Passing getLessThanFive function into filter
const lesserThanFive = numbers.filter(getLessThanFive)
// Passing getMoreThanTen function into filter
const moreThanTen = numbers.filter(getMoreThanTen)
復(fù)制代碼
這就是為什么你在同步函數(shù)中使用回調(diào)函數(shù)的原因。現(xiàn)在,讓我們繼續(xù)看看為什么我們在異步函數(shù)中使用回調(diào)。
這里的異步意味著,如果JavaScript需要等待某些事情完成,它將在等待時執(zhí)行給予它的其余任務(wù)。
異步函數(shù)的一個示例是setTimeout。它接受一個回調(diào)函數(shù)以便稍后執(zhí)行:
// Calls the callback after 1 second
setTimeout(callback, 1000)
復(fù)制代碼
如果你給JavaScript另外一個任務(wù)需要完成,讓我們看看setTimeout是如何工作的:
const tenSecondsLater = _ = > console.log('10 seconds passed!')
setTimeout(tenSecondsLater, 10000)
console.log('Start!')
復(fù)制代碼
在上面的代碼中,JavaScript會執(zhí)行setTimeout。然后,它會等待10秒,之后打印出"10 seconds passed!"的消息。
同時,在等待setTimeout10秒內(nèi)完成時,JavaScript執(zhí)行console.log("Start!")。
所以,如果你(在控制臺上)打印上面的代碼,這就是你會看到的:
// What happens:
// > Start! (almost immediately)
// > 10 seconds passed! (after ten seconds)
復(fù)制代碼
啊~異步操作聽起來很復(fù)雜,不是嗎?但為什么我們在JavaScript中頻繁使用它呢?
要了解為什么異步操作很重要呢?想象一下JavaScript是你家中的機器人助手。這個助手非常愚蠢。它一次只能做一件事。(此行為被稱為單線程)。
假設(shè)你告訴你的機器人助手為你訂購一些披薩。但機器人是如此的愚蠢,在打電話給披薩店之后,機器人坐在你家門前,等待披薩送達。在此期間它無法做任何其它事情。
你不能叫它去熨衣服,拖地或在等待(披薩到來)的時候做任何事情。(可能)你需要等20分鐘,直到披薩到來,它才愿意做其他事情...
此行為稱為阻塞。當(dāng)你等待某些內(nèi)容完成時,其他操作將被阻止。
const orderPizza = flavour => {
callPizzaShop(`I want a ${flavour} pizza`)
waits20minsForPizzaToCome() // Nothing else can happen here
bringPizzaToYou()
}
orderPizza('Hawaiian')
// These two only starts after orderPizza is completed
mopFloor()
ironClothes()
復(fù)制代碼
而阻止操作是一個無賴。
為什么?
讓我們把愚蠢的機器人助手放到瀏覽器的上下文中。想象一下,當(dāng)單擊按鈕時,你告訴它更改按鈕的顏色。
這個愚蠢的機器人會做什么?
它專注于按鈕,忽略所有命令,直到按鈕被點擊。同時,用戶無法選擇任何其他內(nèi)容。看看它都在干嘛了?這就是異步編程在JavaScript中如此重要的原因。
但是,要真正了解異步操作期間發(fā)生的事情,我們需要引入另外一個東西 -- 事件循環(huán)。
為了設(shè)想事件循環(huán),想象一下JavaScript是一個攜帶todo-list的管家。此列表包含你告訴它要做的所有事情。然后,JavaScript將按照你提供的順序逐個遍歷列表。
假設(shè)你給JavaScript下面五個命令:
const addOne = (n) => n + 1
addOne(1) // 2
addOne(2) // 3
addOne(3) // 4
addOne(4) // 5
addOne(5) // 6
復(fù)制代碼
這是JavaScript的待辦事項列表中出現(xiàn)的內(nèi)容。
相關(guān)命令在JavaScript待辦事項列表中同步出現(xiàn)。
除了todo-list之外,JavaScript還保留一個waiting-list來跟蹤它需要等待的事情。如果你告訴JavaScript訂購披薩,它會打電話給披薩店并在等候列表名單中添加“等待披薩到達”(的指令)。與此同時,它還會做了其他已經(jīng)在todo-list上的事情。
所以,想象下你有下面代碼:
const orderPizza (flavor, callback) {
callPizzaShop(`I want a ${flavor} pizza`)
// Note: these three lines is pseudo code, not actual JavaScript
whenPizzaComesBack {
callback()
}
}
const layTheTable = _ => console.log('laying the table')
orderPizza('Hawaiian', layTheTable)
mopFloor()
ironClothes()
復(fù)制代碼
JavaScript的初始化todo-list如下:
訂披薩,拖地和熨衣服!
然后,在執(zhí)行orderPizza時,JavaScript知道它需要等待披薩送達。因此,它會在執(zhí)行其余任務(wù)時,將“等待披薩送達”(的指令)添加到waiting list上。
JavaScript等待披薩到達
當(dāng)披薩到達時,門鈴會通知JavaScript,當(dāng)它完成其余雜務(wù)時。它會做個**心理記錄(mental note)**去執(zhí)行l(wèi)ayTheTable。
JavaScript知道它需要通過在其 mental note 中添加命令來執(zhí)行l(wèi)ayTheTable
然后,一旦完成其他雜務(wù),JavaScript就會執(zhí)行回調(diào)函數(shù)layTheTable。
其他所有內(nèi)容完成后,JavaScript就會去布置桌面(layTheTable)
我的朋友,這個就被稱為事件循環(huán)。你可以使用事件循環(huán)中的實際關(guān)鍵字替換我們的管家,類比來理解所有的內(nèi)容:
JavaScript的事件循環(huán)
如果你有20分鐘的空余時間,我強烈建議你觀看Philip Roberts 在JSconf中談?wù)摰氖录h(huán)。它將幫助你理解事件循環(huán)的細節(jié)。
哦~我們在事件循環(huán)繞了一大圈。我們回正題吧。
之前,我們提到如果JavaScript專注于按鈕并忽略所有其他命令,那將是不好的。是吧?
通過異步回調(diào),我們可以提前提供JavaScript指令而無需停止整個操作。
現(xiàn)在,當(dāng)你要求JavaScript查看點擊按鈕時,它會將“監(jiān)聽按鈕”(指令)放入waiting list中并繼續(xù)進行雜務(wù)。當(dāng)按鈕最終獲得點擊時,JavaScript會激活回調(diào),然后繼續(xù)執(zhí)行。
以下是回調(diào)中的一些常見用法,用于告訴JavaScript要做什么...
// Callbacks in event listeners
document.addEventListener(button, highlightTheButton)
document.removeEventListener(button, highlightTheButton)
// Callbacks in jQuery's ajax method
$.ajax('some-url', {
success (data) { /* success callback */ },
error (err) { /* error callback */}
});
// Callbacks in Node
fs.readFile('pathToDirectory', (err, data) => {
if (err) throw err
console.log(data)
})
// Callbacks in ExpressJS
app.get('/', (req, res) => res.sendFile(index.html))
復(fù)制代碼
這就是它(異步)的回調(diào)!
希望你清楚callbacks是什么以及現(xiàn)在如何使用它們。在開始的時候,你不會創(chuàng)建很多回調(diào),所以要專注于學(xué)習(xí)如何使用可用的回調(diào)函數(shù)。
現(xiàn)在,在我們結(jié)束(本文)之前,讓我們看一下開發(fā)人員(使用)回調(diào)的第一個問題 -- 回調(diào)地獄。
回調(diào)地獄是一種多次回調(diào)相互嵌套的現(xiàn)象。當(dāng)你執(zhí)行依賴于先前異步活動的異步活動時,可能會發(fā)生這種情況。這些嵌套的回調(diào)使代碼更難閱讀。
根據(jù)我的經(jīng)驗,你只會在Node中看到回調(diào)地獄。在使用前端JavaScript時,你幾乎從不會遇到回調(diào)地獄。
下面是一個回調(diào)地獄的例子:
// Look at three layers of callback in this code!
app.get('/', function (req, res) {
Users.findOne({ _id:req.body.id }, function (err, user) {
if (user) {
user.update({/* params to update */}, function (err, document) {
res.json({user: document})
})
} else {
user.create(req.body, function(err, document) {
res.json({user: document})
})
}
})
})
復(fù)制代碼
而現(xiàn)在,你有個挑戰(zhàn) -- 嘗試一目了然地破譯上面的代碼。很難,不是嗎?難怪開發(fā)者在看到嵌套回調(diào)時會不寒而栗。
克服回調(diào)地獄的一個解決方案是將回調(diào)函數(shù)分解為更小的部分以減少嵌套代碼的數(shù)量:
const updateUser = (req, res) => {
user.update({/* params to update */}, function () {
if (err) throw err;
return res.json(user)
})
}
const createUser = (req, res, err, user) => {
user.create(req.body, function(err, user) {
res.json(user)
})
}
app.get('/', function (req, res) {
Users.findOne({ _id:req.body.id }, (err, user) => {
if (err) throw err
if (user) {
updateUser(req, res)
} else {
createUser(req, res)
}
})
})
復(fù)制代碼
更容易閱讀了,是吧?
還有其他解決方案來對抗新版JavaScript中的回調(diào)地獄 -- 比如promises和async / await。但是,解釋它們是我們另一天的話題。
今天,你了解到了回調(diào)是什么,為什么它們在JavaScript中如此重要以及如何使用它們。你還學(xué)會了回調(diào)地獄和對抗它的方法。現(xiàn)在,希望callbakcs不再嚇到你了。
你對回調(diào)還有任何疑問嗎?如果你有,請隨時在下面發(fā)表評論,我會盡快回復(fù)你的。【PS:本文譯文,若需作者解答疑問,請移步原作者文章下評論】
感謝閱讀。這篇文章是否幫助到你?如果有,我希望你考慮分享它。你可能會幫助到其他人。非常感謝!
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。