2015-07-09 2 views
1

Этот вопрос несколько академичен тем, что у меня нет реального необходимо для этого.Могу ли я заставить разрешение обещания ждать результатов в javascript?

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

В .NET Я могу сделать что-то вроде этого, используя функции на Task[] или return Task.Result, что заставляет вызывающего абонента ждать завершения задачи, и вызывающие абоненты не будут знать или не заботятся о том, чтобы работа была выполнена с использованием задач.

+1

Код примера было бы неплохо. – elclanrs

+0

В каком контексте? Узел или браузер? – Tivie

+0

Вы имеете в виду что-то вроде этого псевдокода? 'var foo = compat.resolve()'; – Tivie

ответ

4

Если вы используете ES6, вы можете использовать генератор, чтобы сделать такой код. По сути, он близок к «блокировке» обещания, поэтому у вас появляется долговременный метод, который просто возвращает значение, которое вы хотите, но async/обещает жить под обложками.

let asyncTask =() => 
    new Promise(resolve => { 
    let delay = Math.floor(Math.random() * 100); 

    setTimeout(function() { 
     resolve(delay); 
    }, delay); 
    }); 

let makeMeLookSync = fn => { 
    let iterator = fn(); 
    let loop = result => { 
    !result.done && result.value.then(res => 
     loop(iterator.next(res))); 
    }; 

    loop(iterator.next()); 
}; 

makeMeLookSync(function*() { 
    let result = yield asyncTask(); 

    console.log(result); 
}); 

Более объяснение и источник доступен здесь: http://www.tivix.com/blog/making-promises-in-a-synchronous-manner/

Here is the code составлен на Babeljs.io

+1

(плюс один) будет что-то вроде этой работы в контексте браузера? – Tivie

+0

Это будет работать в браузерах, поддерживающих генераторы, да. В противном случае вы можете скомпилировать его на ES5 с помощью Babel, и он будет работать практически везде. – elclanrs

+0

Это 'Promise' является общей функцией в этом примере, поэтому вам нужно будет предоставить это. Генераторы имеют полиполк, предоставленный Babel (транспилер ES6) https://babeljs.io/docs/learn-es2015/#generators. На данный момент все это немного кровоточит, но в браузере нет ничего, что не могло бы работать. –

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