第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

用 promises 和 undefined var 理解奇怪的錯(cuò)誤

用 promises 和 undefined var 理解奇怪的錯(cuò)誤

蝴蝶刀刀 2022-10-08 15:04:46
我剛剛發(fā)現(xiàn)當(dāng)幾乎同時(shí)觸發(fā) 2 個(gè)請(qǐng)求時(shí),我的 API 正在做一些奇怪的事情。我發(fā)現(xiàn)問題是我在下面的“用戶”變量之前缺少“var”聲明,但我真的很好奇導(dǎo)致下面描述的錯(cuò)誤的根本問題:我有兩個(gè) API 端點(diǎn)調(diào)用相同的函數(shù),如下所示:router.get('/refresh_session_token', function (req, res) {   let user_id = req.body.user_id // The value sent is 8   findUserWithId(user_id)    .then(user_data => {      user = user_data // I forgot 'var' here    })    .then(() => {      console.log(user) // This should always show user data from user_id = 8    })}router.get('/resend_invite', function (req, res) {   let user_id = req.body.user_id // The value sent is 18   findUserWithId(user_id)    .then(user_data => {      user = user_data // I forgot 'var' here    })    .then(() => {      console.log(user) // This should always show user data from user_id = 18    })}const findUserWithId = (id) => {  return knex.raw(`SELECT * FROM users WHERE id = ?`, [id]).then((data) => data.rows[0])}所有這些代碼都在我通過 module.exports = router; 導(dǎo)出的同一個(gè)文件中我發(fā)現(xiàn),如果我?guī)缀跬瑫r(shí)觸發(fā)端點(diǎn)/refresh_session_token和/resend_invite,每個(gè)端點(diǎn)都有兩個(gè)不同的 user_id,有時(shí)我的 console.log 會(huì)返回相同的結(jié)果,就好像我使用相同的 user_id 一樣。向用戶添加 var 解決了這個(gè)問題,但我對(duì)后臺(tái)實(shí)際發(fā)生的事情感到非常驚訝。你有什么主意嗎?
查看完整描述

1 回答

?
守候你守候我

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊

當(dāng)你沒有聲明你的變量并且你沒有在 Javascriptstrict模式下運(yùn)行你的模塊時(shí),那么首先分配給該變量:

user = user_data

創(chuàng)建一個(gè)名為 的自動(dòng)全局變量user。這意味著您的兩條路線將共享同一個(gè)變量。

而且,由于您的兩條路由都具有異步操作,即使是單線程的東西,您的兩條路由仍然可以同時(shí)進(jìn)行,并且都嘗試使用相同的全局變量。一條路線將覆蓋另一條路線的值。這在基于服務(wù)器的代碼中是一場(chǎng)災(zāi)難,因?yàn)橥ǔ#谀度肷a(chǎn)之前,該錯(cuò)誤不會(huì)出現(xiàn),而且很難找到可重現(xiàn)的案例。

最好的答案是始終在嚴(yán)格模式下運(yùn)行代碼,然后 JS 解釋器會(huì)將其設(shè)為錯(cuò)誤,并且您將永遠(yuǎn)不會(huì)被允許以這種方式運(yùn)行代碼。錯(cuò)誤將很快被發(fā)現(xiàn)。

let那么顯然,總是用or聲明變量const。很少有理由再使用varasletconst讓您更好地控制變量的范圍。

要在嚴(yán)格模式下運(yùn)行您的模塊,請(qǐng)插入:

'use strict';

在任何其他 Javascript 語句之前。

或者,使用 TypeScript 之類的東西,它不會(huì)讓你做一些草率的事情,比如不聲明你的變量。


查看完整回答
反對(duì) 回復(fù) 2022-10-08
  • 1 回答
  • 0 關(guān)注
  • 104 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)