2016-06-09 5 views
3

Пример 1Разница между Q.fcall и (Q.defer + Q.resolve + Q.promise)/Q библиотеки

function first(a, b) { 
    return a + b; 
} 
function second() { 
    return Math.floor(Math.sqrt(arguments[0])); 
} 
function third() { 
    return Math.PI * (arguments[0]); 
} 
Q.fcall(first, 3, 4) 
    .then(second) 
    .then(third) 
    .then(function (result) { 
     console.log(result); 
    }); 

Пример 2

function first(a, b) { 
    var d = Q.defer(); 
    if (isNaN(a) || isNaN(b)) { 
     d.reject('Wrong Numbers'); 
    } else { 
     d.resolve(a + b); 
    } 
    return d.promise; 
} 
function second() { 
    return Math.floor(Math.sqrt(arguments[0])); 
} 
function third() { 
    return Math.PI * (arguments[0]); 
} 
first(3, 4) 
    .then(second) 
    .then(third) 
    .then(function (result) { 
     console.log(result); 
    }, function (error) { 
     console.log(error); 
    }); 

Так что разница между этим 2 примера, потому что из того, что я мог понять сам по себе, было то, что с помощью Пример 2 у нас есть обработчики ошибок и успехов и в . Пример 1 мы не

ответ

2

Два примера аналогичны, однако в первом примере вы адаптируете функцию без обеда, тогда как вторая непосредственно возвращает обещание. Если вы пишете свои собственные функции, когда вы всегда хотите вернуть обещания, ваш второй пример будет предпочтительнее. Однако это, конечно же, связано с адаптацией, если функции должны использоваться в контексте, не имеющем обещаний. Q.fcall чаще используется для адаптации сторонних функций к парадигме, основанной на обещании.

Вот третий пример, который вы могли бы также использовать (это мой Предпочитаемый способ делать вещи при написании библиотеки на основе обещания):

function first(a, b) { 
    if (isNaN(a) || isNaN(b)) { 
     return Q.reject('Wrong Numbers'); 
    } else { 
     return Q(a + b); 
    } 
} 
function second() { 
    return Q(Math.floor(Math.sqrt(arguments[0]))); 
} 
function third() { 
    return Q(Math.PI * (arguments[0])); 
} 
first(3, 4) 
    .then(second) 
    .then(third) 
    .then(function (result) { 
     console.log(result); 
    }) 
    .fail(function (error) { 
     console.log(error); 
    }); 

Это удаляет ненужные вызовы Q.defer() с помощью следующих действий:

Q (значение)

Если значение является Q обещание, возвращает обещание.

Если значение является обещанием от другой библиотеки, оно принуждается к обещанию Q (где это возможно).

Если значение не является обещанием, возвращается обещание, которое выполняется с помощью значения .

Q.reject (причина)

Возвращает обещание, что отвергается разумом.

Следует также отметить, что Q содержит целый ряд методов для адаптации различных типов функций, методов, обратных вызовов стиля nodejs и т. Д. К системе, основанной на Q-обещании. Многие из них не упоминаются в readme, instead check the API reference.

+0

ye ik, а затем некоторые люди задаются вопросом, почему большинство людей полностью игнорируют readme-s –

 Смежные вопросы

  • Нет связанных вопросов^_^