Heim >Web-Frontend >js-Tutorial >Einführung in JavaScript: Handschriftliche asynchrone Additionsmethode asyncAdd
Dieser Artikel bringt Ihnen relevantes Wissen über Javascript. Er stellt Ihnen vor allem die detaillierte Erklärung der asynchronen Additionsmethode von JavaScript vor. Ich hoffe, dass wir gemeinsam einen Blick darauf werfen an alle.
[Verwandte Empfehlungen: Javascript-Video-Tutorial, Web-Frontend]
Ich habe eine einfache, aber interessante Frage zu Nuggets gefunden. Der Titel lautet wie folgt:
// 异步加法 function asyncAdd(a,b,cb){ setTimeout(() => { cb(null, a + b) }, Math.random() * 1000) } async function total(){ const res1 = await sum(1,2,3,4,5,6,4) const res2 = await sum(1,2,3,4,5,6,4) return [res1, res2] } total() // 实现下 sum 函数。注意不能使用加法,在 sum 中借助 asyncAdd 完成加法。尽可能的优化这个方法的时间。 function sum(){ }
Sie können es versuchen Um es direkt umzusetzen und den Zusammenhang zwischen Ihrem eigenen Denken und den Grundkenntnissen von JavaScript
zu überprüfen, vermeiden Sie es bitte! JavaScript
基础知识的联系如何,大佬请绕行!
估计大多数人第一眼看下都不知道这题目到底要干啥(我不说就没人知道我也是),但是在看第二遍的时候估计就差不多明白具体是要考察什么内容了,下面就一起来分析分析吧!!!
这里先放置最终结论:
sum
部分的内容,sum
可接收任意长度的参数sum
中只能通过 asyncAdd
实现加法计算sum
中需要处理异步逻辑,需要使用 Promise
sum
方法的计算时间下面是分别通过对代码的不同部分进行分析,获取到的相关的信息。
// 实现下 sum 函数。注意不能使用加法,在 sum 中借助 asyncAdd 完成加法。尽可能的优化这个方法的时间。 function sum(){ }
最直观的方式就是通过上述的文字描述部分,可以很容易知道题目具体要求:
sum
函数,即只能修改 sum
部分的内容asyncAdd
实现加法sum
方法的计算时间// 异步加法 function asyncAdd(a, b, cb){ setTimeout(() => { cb(null, a + b) }, Math.random() * 1000) }
从上述内容来看,最明显的就是 setTimeout
和 cb
了,其实这不难理解因为在 asyncAdd
中使用了 setTimeout
只能通过回调函数 cb
将本次计算结果返回出去,那其中的第一个参数 null
代表什么呢?
其实可以认为它是一个错误信息对象,如果你比较了解 node
的话,就会知道在 node
中的异步处理的回调函数通常第一个参数就是错误对象,用于传递给外部在发生错误时自定义后续执行逻辑等。
一句话: cb
函数会接收 错误对象 和 计算结果 作为参数传递给外部。
async function total(){ const res1 = await sum(1,2,3,4,5,6,4) const res2 = await sum(1,2,3,4,5,6,4) return [res1, res2] }
从上述的这部分来看,sum
方法的 返回值 肯定是一个 promise
类型的,因为最前面明显的使用了 await sum(...)
的形式。
另外 total
函数返回值也必然是一个 promise
类型,因为整个 total
函数被定义为了一个 async
异步函数,可点击此处查看详细内容。
一句话:sum
需要返回 promise
类型的值,即 sum
一定会使用到 promise
,并且从 sum(1,2,3,4,5,6,4)
可知 sum
可接收任意长度的参数。
实现思路如下:
asyncAdd
中的异步操作,将其封装为 Promise
的实现,即 caculate
函数asyncAdd
实际只能一次接收两个数字进行计算,使用循环的形式将多个参数分别传入async/await
来保证正确的执行顺序,且 async
函数的返回值正好符合 sum
是 Promise
类型的要求具体代码如下:
// 通过 ES6 的剩余运算符(...) 接收外部传入长度不固定的参数 async function sum(...nums: number[]) { // 封装 Promise function caculate(num1: number, num2: number) { return new Promise((resolve, reject) => { // 调用 asyncAdd 实现加法 asyncAdd(num1, num2, (err: any, rs: number) => { // 处理错误逻辑 if (err) { reject(err); return; } // 向外部传递对应的计算结果 resolve(rs); }); }) } let res: any = 0; // 通过遍历将参数一个个进行计算 for (const n of nums) { // 为了避免异步执行顺序问题,使用 await 等待执行结果 res = await caculate(res, n); } return res; }
caculate
函数可抽离到 sum
函数外层asyncAdd
函数的回调函数没必要抽离,因为它依赖的参数和外部方法太多function caculate(num1: number, num2: number) { return new Promise((resolve, reject) => { asyncAdd(num1, num2, (err: any, rs: number) => { if (err) { reject(err); return; } resolve(rs); }); }) } async function sum(...nums: number[]) { let res: any = 0; for (const n of nums) { res = await caculate(res, n); } return res; }
其实你仔细观察 total
方法,其中 sum
sum
kann geändert werden und sum
kann Parameter empfangen beliebiger Länge li>sum
kann die Additionsberechnung nur über asyncAdd
sum verarbeitet werden
, was erfordert Die Verwendung von Promise
sum
-Methode optimierenasync function total(){ const res1 = await sum(1,2,3,4,5,6,4) const res2 = await sum(1,2,3,4,5,6,4) return [res1, res2] }🎜Am intuitivsten können Sie anhand des obigen Textbeschreibungsteils leicht die spezifischen Anforderungen der Frage erkennen: 🎜
sum code>-Funktion, das heißt, sie kann nur den Inhalt des <code>sum
-Teils ändern
asyncAdd
sum
-Methodeconst cash: any = {}; function isUndefined(target: any) { return target === void 0; } async function sum(...nums: number[]) { let res: any = 0; const key = nums.join('+'); if (!isUndefined(cash[key])) return cash[key]; for (const n of nums) { res = await caculate(res, n); } cash[key] = res; return res; } function caculate(num1: number, num2: number) { return new Promise((resolve, reject) => { asyncAdd(num1, num2, (err: any, rs: number) => { if (err) { reject(err); return; } resolve(rs); }); }) }🎜From Der obige Inhalt ist der offensichtlichste
setTimeout
und cb
. Tatsächlich ist dies nicht schwer zu verstehen, da setTimeout
in asyncAdd
und kann nur über die Rückruffunktion cb
übergeben werden. Gibt das Ergebnis dieser Berechnung zurück. Was stellt der erste Parameter null
dar? 🎜🎜Tatsächlich kann es als Fehlermeldungsobjekt betrachtet werden. Wenn Sie mehr über node
wissen, wissen Sie, dass die Rückruffunktion für die asynchrone Verarbeitung in node
normalerweise über Folgendes verfügt erster Parameter Es ist das Fehlerobjekt, das zur Weitergabe nach außen verwendet wird, um die nachfolgende Ausführungslogik anzupassen, wenn ein Fehler auftritt. 🎜🎜Ein Satz: Die Funktion cb
empfängt das Fehlerobjekt und das Berechnungsergebnis als Parameter und gibt sie nach außen weiter. 🎜sum
-Methode vom Typ promise
sein. Ja, weil vorne eindeutig die Form von await sum(...)
verwendet wird. 🎜🎜Darüber hinaus muss der Rückgabewert der Funktion total
ebenfalls vom Typ promise
sein, da die gesamte Funktion total
als async Asynchrone Funktion, klicken Sie hier, um Details anzuzeigen. 🎜🎜Ein Satz: sum
muss einen Wert vom Typ promise
zurückgeben, das heißt, sum
wird definitiv promise
verwenden > und Aus sum(1,2,3,4,5,6,4)
können wir sehen, dass sum
Parameter beliebiger Länge empfangen kann. 🎜🎜AsyncAdd implementieren🎜asyncAdd
und kapseln Sie sie als Implementierung von Promise
, also der Funktion caculate
li>asyncAdd
tatsächlich nur zwei Zahlen gleichzeitig zur Berechnung empfangen und verwendet eine Schleife, um mehrere Parameter separat zu übergeben.async
stimmt genau mit der sum
überein und ist von Anforderungen für den Typ Promise
caculate
Die Funktion kann in die äußere Schicht der sum
-Funktion extrahiert werdenasyncAdd
Die Rückruffunktion von Die Funktion muss nicht extrahiert werden, da sie auf zu vielen Parametern und externen Methoden basiert. Multitotal
-Methode, sum
wird zweimal aufgerufen und Die Parameter sind immer noch dieselben. Der Zweck besteht darin, Sie aufzufordern, die Ergebnisse direkt aus dem Cache abzurufen, wenn derselbe Inhalt für berechnet wird zweites Mal statt durch asynchrone Berechnung. 🎜rrreee🎜Das Folgende ist nur eine Implementierung einer einfachen Caching-Lösung. Machen Sie sich keine allzu großen Sorgen. Die spezifische Implementierung ist wie folgt: 🎜const cash: any = {}; function isUndefined(target: any) { return target === void 0; } async function sum(...nums: number[]) { let res: any = 0; const key = nums.join('+'); if (!isUndefined(cash[key])) return cash[key]; for (const n of nums) { res = await caculate(res, n); } cash[key] = res; return res; } function caculate(num1: number, num2: number) { return new Promise((resolve, reject) => { asyncAdd(num1, num2, (err: any, rs: number) => { if (err) { reject(err); return; } resolve(rs); }); }) }
【相关推荐:javascript视频教程、web前端】
Das obige ist der detaillierte Inhalt vonEinführung in JavaScript: Handschriftliche asynchrone Additionsmethode asyncAdd. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!