2015-09-29 3 views
2

Запрос запроса бриза возвращает интерфейс breeze.Promises.IPromise.Как вернуть ECMASCRIPT 6 Обещание от бриза

Использование kris kalal's Q promises., и оно использует Q.Deferred для возврата обещания.

Q предоставляет совместимый с ES6 Promise с Q.Promise.

Как получить ES6 Promise из запроса бриза? Я в основном надеюсь на гладкий способ конвертировать Q.Deferred в Q.Promise.

function getES6Promise() { 
    var query = breeze.EntityQuery.from("Table"); 
    // How to return as an ES6 Promise? 
    return em.executeQuery(query); 
} 

ответ

0

Я считаю, что вы должны настроить ветер с оберткой вокруг Promise, что делает его похожим на Q.

Breeze нужен только крошечную часть интерфейса Q: defer, resolve и reject. defer имеет свойство promise. resolve и reject возврат обещаний. Обещание может приходить из любой библиотеки, если оно подходит подходящему методу then.

Вот обертка я состряпал с верхней части моей головы, но на самом деле не пробовал:

(function() { 
    function defer() { 
    var deferred = {} 
    deferred.promise = new Promise((resolve, reject) => { 
     deferred.resolve = resolve; 
     deferred.reject = reject; 
    }) 
    return deferred; 
    } 
    var Q = { 
    all: Promise.all, 
    defer: defer, 
    resolve: Promise.resolve, 
    reject: Promise.reject 
    } 
    breeze.config.setQ(Q) 
})() 

FWIW, интерфейс breeze.Promises.IPromise, к которому ваш см бесполезен и должен быть удален из документации.

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

Многие из примеров API и документации используют fail и fin. Очевидно, что это не методы обещания ES6 и не будут работать. Вы хотите, чтобы catch для fail и then(finFn, finFn) для fin(finFn).

К счастью, внутренний бриз вызывает только promise.then и не использует эти другие методы обещания.

Попробуйте мое предложение об упаковке позже и сообщите нам, как это работает.