1

在我的视图模型的激活方法中,我有以下代码。

function activate() {
    var promise = Q.all([datacontext.getManufacturers(manufacturers)]);
    logger.log('Frames View Activated', null, 'frames', false);
    return promise;
}

在我的数据上下文代码中,我有

var getManufacturers = function (manufacturerObservable) {
    var query = entityQuery.from('Manufacturers')
        .orderBy('name');

    return manager.executeQuery(query)
        .then(querySucceeded)
        .fail(queryFailed);

    function querySucceeded(data) {
         if (manufacturerObservable) {
             manufacturerObservable(data.results);
         }
         log('Retrieved [Manufacturer] from remote data source',
             data, false);
    }
};

我希望设置承诺的方式将检索制造商,然后激活方法将完成。我希望在“框架视图激活”日志消息之前出现“从远程数据源检索 [制造商]”日志消息,但实际上相反。如何在激活方法完成之前完成数据检索?

4

2 回答 2

3

在这种情况下,我认为您根本不需要 Q 。微风数据管理器返回自己的承诺。

function activate() {
    logger.log('Frames View Activated', null, 'frames', false);
    return datacontext.getManufacturers(manufacturers);
}

这确保在激活函数返回之前 getManufacturer 函数已经完成。

但是,如果您希望 Frames View Activated 在检索到的消息之后显示,那么您可以使用promise.spread.then(function() {logger.log('Frames View Activated', null, 'frames', false); })promise.then(function() {logger.log('Frames View Activated', null, 'frames', false); })

于 2013-05-07T04:43:21.953 回答
2

这里的问题似乎是,当微风使用 Q 延迟/承诺实现时,Durandal 使用 JQuery 延迟/承诺实现。

通过将两者混合,您可能会遇到一些问题。

如果您阅读 Durandal 文档,他们有一个解决方案可以让 Durandal 使用 Q 而不是 JQuery,以便您为您的应用程序获得一致的延迟/承诺解决方案。

于 2013-05-10T09:57:33.843 回答