国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

javascript – Ein Problem tritt auf, wenn nodejs eine asynchrone Implementierung implementiert
黃舟
黃舟 2017-07-03 11:41:44
0
6
1017

Zum Beispiel gibt es drei Funktionen a, b und c, die alle Synchronisierungsvorg?nge ausführen. Zur Vereinfachung habe ich die Synchronisierungsvorg?nge vereinfacht

function c(m) {
    m = m + 1;
    return m;
}
function b(m) {
    m = m + 1;
    return c(m);
}
function a(){
    let m = 0;
    return b(m);
}

Die Ausgabe der Ausführung von a() ist 2

Aber wenn die c-Funktion beispielsweise keine synchrone Funktion, sondern eine asynchrone Operation ausführt

function c(m) {
    setTimeout(function () {
        m = m + 1;
    }, 1000)
    return m;
}

Wenn Sie beim Ausführen von a() korrekt 2 ausgeben m?chten, müssen Sie c durch Promise oder Async kapseln,

?hnlich wie

function promiseC(m) {
    return new Promise((resolve, reject) => {
        setTimeout(function () {
        m = m + 1;
        resolve(m);
        }, 1000)
    }
}
async function c(m) {
    m = await promiseC(m);
    return m; 
}

Da c zu einer asynchronen Funktion wird, muss b c aufrufen, b muss auch in asynchron ge?ndert werden und so weiter, a muss ebenfalls in asynchron ge?ndert werden

async function b(m) {
    m = m + 1;
    return await c(m);
}
async function a(){
    let m = 0;
    return await b(m);
}

a().then(function(data) {

console.log(data)

}) Auf diese Weise k?nnen 2

ausgegeben werden

Um 2 korrekt auszugeben, habe ich sowohl a als auch b ge?ndert. Ich frage mich, ob es eine andere M?glichkeit gibt, die ?nderung von a und b zu vermeiden und die korrekte Ausgabe zu erzielen.

Da ich die asynchrone Situation nicht berücksichtigt habe, als ich zum ersten Mal mit dem Schreiben des Codes begonnen habe, sind Funktionen wie a und b in verschiedenen Dateien verteilt, und es gibt viele davon, damit c asynchrone Vorg?nge ausführen kann Es ist zu schwierig, sie zu ?ndern. Ich wei? es nicht. Haben Sie andere gute Methoden?

Das Folgende ist eine neu hinzugefügte Frage

Das obige Problem kann gel?st werden, indem das Versprechensobjekt in der Antwort unten direkt zurückgegeben wird, aber die tats?chliche Codestruktur ist eher so

function c(m) {
    m = m + 1;
    return m;
}
function b(m) {
    m = m + 1;
    let n = c(m)
    n = n + 1
    return n;
}
function a(){
    let m = 0;
    let k = b(m);
    k = k + 1;
    return k;
}

Wenn ich dieser Methode folge, muss ich die Rückgabemethoden von a und b ?ndern

, damit a und b Versprechensobjekte zurückgeben k?nnen.
Für eine solche Struktur wei? ich nicht, ob es eine M?glichkeit gibt, ohne diese eine korrekte Ausgabe zu erzielen ?ndern der Funktionen von a und b

黃舟
黃舟

人生最曼妙的風(fēng)景,竟是內(nèi)心的淡定與從容!

Antworte allen(6)
阿神

很遺憾的告訴你,node這邊是顯式異步的,所以你把一個(gè)函數(shù)從同步改成異步,那么依賴它的函數(shù)也必須做更改,重構(gòu)的時(shí)候確實(shí)是個(gè)頭疼的事情,你還是忍著改改吧。

像fibjs這種不需要異步關(guān)鍵字的重構(gòu)起來就很省心了,你改了c不需要改動(dòng)a和b,因?yàn)殡[式異步不需要你指示它。

洪濤

還是對Promise的理解不到位啊。這里沒必要改動(dòng)b()a()的。

對于函數(shù)c,只需要返回一個(gè)promise對象,經(jīng)過函數(shù)b的時(shí)候,直接同步返回這個(gè)Promise對象,不需要改動(dòng)函數(shù)b使其為異步函數(shù),因?yàn)楫惒讲僮魇窃诤瘮?shù)c中,b中只進(jìn)行了同步操作。此時(shí)需要在函數(shù)a中捕獲這個(gè)Promise,所以代碼可以改成這樣

function promiseC(m) {
    return new Promise((resolve, reject) => {
        setTimeout(function () {
            m = m + 1;
            resolve(m);
        }, 1000)
    })
}


function c(m) {
    m = promiseC(m);
    return m;
}

function b(m) {
    m = m + 1;
    return c(m);
}
function a() {
    let m = 0;
    return b(m);
}

p.then(function(a){
    console.log(a)
})

所以,這里函數(shù)a(),b()如果不處理異步操作的返回值,那為何要把他改成Async函數(shù)呢。

扔個(gè)三星炸死你

可以試試 http://fibjs.org/docs/manual/... 直接轉(zhuǎn)成同步即可

滿天的星座

不得不說我盯著屏幕打了好些草稿, 最終還是失敗了.

我想不出有什么方法能在 js 里阻塞當(dāng)前函數(shù)但是又能及時(shí)執(zhí)行 promise 的 resolve. 失敗的思路如下

c_result=null
c=async (m)=>{return m+1}
c_sync = (m)=>{
    let n=0
        pc=c(m).then((m)=>{c_result=m})
    while(c_result===null && n++<100){}
    return c_result
}
b=(m)=>{return c_sync(m+1)}
a=()=>{return b(0)}
a()

它的問題在于, 雖然while(c_result===null && n++<100){}阻塞了函數(shù)c_sync, 但是也阻止了.then回調(diào)的執(zhí)行. 由于單線程異步的機(jī)制, 當(dāng)某一個(gè)回調(diào)觸發(fā)的時(shí)候, 如果線程正忙, 這個(gè)回調(diào)是沒法插隊(duì)的, 從而導(dǎo)致循環(huán)執(zhí)行過程中, c_result沒辦法被變量 m 賦值.也就沒辦法退出循環(huán).

但是我覺得這個(gè)問題很有意思. 找到了一篇相關(guān)文章. 作者通過一個(gè)外部二進(jìn)制庫結(jié)局了局部阻塞的問題.

http://blog.csdn.net/xingqili...

我的理解是:
基于 js 引擎自身的事件循環(huán), 我們不能阻塞某個(gè)塊. 因?yàn)閷τ?js 代碼而言引擎的事件循環(huán)是在底層. 但是對于外部的二進(jìn)制模塊而言. 其可以阻塞自身, 并保證 js 引擎的事件循環(huán)每一次都完全遍歷事件隊(duì)列----以保證自身阻塞期間在 js 引擎中新增的事件能被處理.

巴扎黑

讓a()輸出promise,確實(shí)可以解決我提到的問題
但是在真正修改代碼的時(shí)候,我發(fā)現(xiàn)大部分代碼的結(jié)構(gòu)不是我上面問題這樣的
而是下面新補(bǔ)充的結(jié)構(gòu)

function c(m) {
    m = m + 1;
    return m;
}
function b(m) {
    m = m + 1;
    let n = c(m)
    n = n + 1
    return n;
}
function a(){
    let m = 0;
    let k = b(m);
    k = k + 1;
    return k;
}
世界只因有你

恕我直言,你沒有對 node.js 的事件循環(huán)機(jī)制和 event 核心模塊作深入的了解。
promise 和 aysnc/await 確實(shí)是如今處理異步流程控制的主流,但并不是說沒有了它們就做不了了,這種簡單的問題回溯到 event 方式處理即可。

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();

myEmitter.on('a', (m) => {
    console.log('a -> b');
    myEmitter.emit('b', m+1);
});
myEmitter.on('b', (m) => {
    console.log('b -> c');
    myEmitter.emit('c', m+1);
});
myEmitter.on('c', (m) => {
    console.log('result', m);
});
myEmitter.emit('a', 0);
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage