2015-07-23 2 views
0

Я пытаюсь обернуть синхронную функцию в обещании.

Может кто-нибудь объяснить объяснение различия между ними?

// Не работает, как ожидалось

var promise = $q.promise; 
promise = $q.when(function() { 
    return 'foo'; 
}); 

promise.then(function(result) { 
    console.log('result = ', result); // Prints 'function anonymous()' in chrome console 
}); 

// Работает, как и ожидалось

var promise = $q.promise; 
promise = $q.when(getIt()); 

function getIt() { 
    return 'foo'; 
} 

promise.then(function(result) { 
    console.log('result = ', result); // Prints 'foo' in chrome console 
}); 
+1

Вы имеете в виду '$ q.when ('foo')'? Если вы настаиваете на этой функции, вы не должны забывать называть ее (как вы делаете с 'getIt()') – Bergi

ответ

2

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

var promise = $q.promise; 
promise = $q.when((function() { 
    return 'foo'; 
})()); 
+0

@downvoter может я знаю причину downvote, пожалуйста? что не так с ответом .. –

0

$ q.when не предназначен для выполнения функции. Он предназначен для переноса ценности, которая может быть или не быть обещанием.

Представьте себе функцию, которая извлекает данные, но имеет кеш, поэтому, если она кэшируется, значение возвращается немедленно, иначе оно возвращает обещание $ http. Это может быть плохой дизайн функции, но такие функции существуют. Использование $ q.when позволяет работать в обоих случаях с одним и тем же простым кодом (не нужно проверять, является ли это обещанием или кешированным значением).

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

Как, вы можете избежать уродливого кода и шаблонный, которые могли бы выглядеть

var results = SomeService.getData(); 
if(results && typeof results.then === "function"){ 
    results.then(doSomething) 
} 
else { 
    doSomething(results) 
}; 

Вместо этого, вы можете уйти с чем-то гораздо проще, вдоль линий:

$q.when(SomeService.getData()).then(doSomething); 

Если потенциальный результат функции, в этом случае SomeService.getData, сам по себе является функцией, тогда автоматически выполнение этой функции не будет ожидаемым поведением, поэтому $q.when не выполняет (и не должен) выполнить аргумент, который вы передаете.

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