2014-02-10 5 views
2

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

fn(args, function (errors, results) {}) 

в

fn(args).then(function (results){}) 

просто вызвав что-то вроде

makePromise(fn, args).then(function (results)) 

в WinJS.

Фон: у меня есть предопределенный интерфейс с использованием асинхронных обратных вызовов, но я бы хотел использовать их в качестве обещания.

Возможно ли это таким образом? Может быть, даже напрямую поддерживается WinJS?

ответ

3

Нет, я не нашел такой метод в official docs. Однако это должно быть сделано:

function makePromise(fn, args) { 
    return new WinJS.Promise(function init(completeDispatch, errorDispatch) { 
     fn(args, function handler(errors, results) { 
      if (errors) 
       errorDispatch(errors); 
      else 
       completeDispatch(results); 
     }); 
    }); 
} 
+2

Это хороший базовый пример. Обратите внимание, что вы потеряете любую область функций, поэтому вам нужно будет привязать любую функцию, используя это. Что-то вроде: 'makePromise (fn.bind (this), args) .then (...);' Также это работает, только если переданная функция принимает один аргумент. – jakerella

+0

Да, это развязывает * context * и дополнительные аргументы, но я думал, что OP им не нужны. Это также излишне усложняло бы пример :-) – Bergi

+1

Конечно, я просто упоминаю об этом, если он кого-то тронет. Этот пример работает для прямого случая выше. – jakerella

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