2016-07-18 30 views
-2

我希望始終獲得「真實」結果,但採用更優雅的方式。這可能嗎?僅在第一次回調時運行函數,但更優雅的方式

function callB(cb) { 
    var i = 1; 
    while (i <= 5) { 
    cb(i); 
    i++; 
    } 
} 

var i = 0; 
callB(function(data) { 
    console.log(data); 
    if (i === 0) { 
    console.log(true); 
    i++; 
    } 
}); 

我想要的結果永遠是第一位的回調之後,但之後,callb函數不會繼續產生更多的回調

+0

你能解釋一下你想要什麼? – Satpal

+0

您是否想在不修改'callB()'函數的情況下執行此操作?也就是說,只改變傳遞給它的函數作爲回調函數? – nnnnnn

+0

你是什麼意思總是「真」?謹慎地闡述更多? –

回答

2

你可以在它之前被調用函數整個包住的部分。

該函數跟蹤它是否是第一次調用並阻止更多的回調調用。

function once(fn) { 
 
    var run = true; 
 
    return function() { 
 
     console.log(arguments); // omit later 
 
     if (run) { 
 
      fn.apply(null, arguments); 
 
      run = false; 
 
     } 
 
    } 
 
} 
 

 
function callB(cb) { 
 
    var i = 1; 
 
    while (i <= 5) { 
 
     cb(i); 
 
     i++; 
 
    } 
 
} 
 

 
callB(once(function (value) { 
 
    console.log(value, true); 
 
}));

+0

這樣做是否節省RAM內存?因爲像我這樣做,我有電腦凍結,在大功能 –

+0

它不保存內存。它只是功能的不同寫法。 –

+0

好的。如果回撥沒有在10秒內到達,您是否認爲我可以超時? –

-1

我根據我的需要調整的功能,即:

function once(fn) { 

    var run = true; 

    var timeout = setTimeout(function() { 
     if (run) { 
      fn(false); 
      run = false; 
     } 
    }, 5000); 

    return function() { 
     console.log(arguments); // omit later 
     if (run) { 
      fn.apply(null, arguments); 
      //resolve(true); 
      clearTimeout(timeout); 
      run = false; 
     } 
    }; 

} 

function callB(cBa) { 
    var i = 1; 
    while (i <= 5) { 
     //cBa(i); 
     i++; 
    } 
} 

callB(once(function (value) { 
    console.log(value); 
})); 
+2

它不會以這種方式工作:*謝謝大家*。你可以看看這裏:http://stackoverflow.com/help/someone-answers –

1

運行此一次,你關注的是性能,那麼請不要把你的回調內環。

function callB(cb) { 
 
    var i = 1; 
 
    cb(i); 
 
    while (i <= 5) { 
 
    i++; 
 
    } 
 
} 
 
callB(v => console.log('Runs once with value ' + v));

相關問題