2016-04-22 3 views
1

Например, яКак сделать функцию с любым количеством аргументов с обратным вызовом

function passConcatenatedStringBack(){ 
    var i,concatString; 
    for(i=0; i<arguments.length;i++){ 
    concatString = arguments[i]; 
    } 
    callback(concatString); // this will be error since callback is undefined 
} 

Как реализовать это в узловом стиле обратного вызова? Без использования обещаний

+0

А как вы передаете обратный вызов? – zerkms

ответ

3
function passConcatenatedStringBack(){ 
    var i,concatString, error; 
    var args = Array.prototype.slice.call(arguments); //convert to Array as Kenichi Shibata pointed out 
    var callback = args.pop(); //get the callback function and remove it from the arguments. 

    for(i=0; i< args.length;i++){ 
    concatString += args[i]; 
    } 
    callback(error, concatString); 
} 

Просто возьмите последний аргумент и используйте его в качестве обратного вызова. Вы по-прежнему должны выполнять проверки для проверки того, предоставил ли пользователь действительный обратный вызов.

+0

. Это выглядит хорошо, но обратный вызов стиля узла - это функция (arg1, ..., function (err, res) {}) –

+0

Спасибо, обновит мой ответ соответственно –

+1

Это будет работать только Проблема заключается в Array.pop(); не будет работать в этом случае, потому что аргументы будут [Object array] not Array Пожалуйста, обновите соответственно :) 'var args = Array.prototype.slice.call (arguments);' 'var callback = args.pop(); ' https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments –

1

Я бы предположил, что первым аргументом всегда является обратный вызов.

Таким образом, я бы проверял, был ли первый аргумент функцией типа, если он есть, а затем использовать это как обратный вызов и использовать остальные как аргументы для функции.

Ну, вы также можете проверить, был ли последний аргумент обратным вызовом или нет.

+0

Вы не можете предположить, что первым аргументом является обратный вызов. Соглашение является последним аргументом - это обратный вызов –

0

ли вы попробовать:

function passConcatenatedStringBack(callback){} 

passConcatenatedStringBack(function (args1){ // callback stuff }); 
1

Распространенный способ, чтобы проверить, если последний аргумент функции:

function fn() { 
    var cb = arguments.pop(); 

    if (typeof cb !== 'function') { 
    throw new Error('No callback provided!'); 
    } 

    // do your stuff and then callback 
    cb(null, result); 
} 
Смежные вопросы