繁体   English   中英

挣扎于Q.js承诺

[英]Struggling with Q.js promises

我确定我缺少明显的东西,但似乎无法解决这个问题。 我有一个由javascript驱动的网页。 绑定是由Knockout.js提供的,数据是使用Breeze.js从服务器Breeze.js ,我使用的是与Require.js捆绑在一起的模块。 我的目标是加载html,从Breeze.js加载信息,然后应用绑定以向用户显示数据。 所有这些事情似乎都是正确发生的,只是顺序不正确,这导致了奇怪的绑定错误。 现在进入代码。

我有一个在页面加载后被调用的函数

function applyViewModel() {
        var vm = viewModel();
        vm.activate()
            .then(
                applyBindings(vm)
            );
    }

这应该调用激活,等待激活完成,然后应用绑定....但是它似乎正在调用激活,而不是等待其完成然后运行applybindings。

启用 -

function activate() {
            logger.log('Frames Admin View Activated', null, 'frames', false);

            return datacontext.getAllManufacturers(manufacturers)
                .then(function () {
                    manufacturer(manufacturers()[0]);
                }).then(function () {
                    datacontext.getModelsWithSizes(modelsWithSizes, manufacturers()[0].manufacturerID())
                        .then(datacontext.getTypes(types));
                });
        }

datacontext.getAllManufacturers-

var getAllManufacturers = 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 [All Manufacturer] from remote data source',
                data, true);
        }
    };

datacontext.getModelsWithSizes-

var getModelsWithSizes = function (modelsObservable, manufacturerId) {
        var query = entityQuery.from('Models').where('manufactuerID', '==', manufacturerId)
            .orderBy('name');

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

        function querySucceeded(data) {
            if (modelsObservable) {
                for (var i = 0; i < data.results.length; i++) {
                    datacontext.getSizes(data.results[i].sizes, data.results[i].modelID());

                    // add new size function
                    data.results[i].addNewSize = function () {
                        var newValue = createNewSize(this.modelID());
                        this.sizes.valueHasMutated();
                        return newValue;
                    };
                }
                modelsObservable(data.results);

            }
            log('Retrieved [Models With Sizes] from remote data source',
                data, false);
        }
    };

任何对为什么不能兑现承诺的帮助都会得到帮助,任何解决它的过程也将不胜感激,以便下次遇到这个问题时我能为自己提供帮助。

使用Promise时的一个常见错误是,您没有指定回调 ,而是指定了从回调返回

function applyViewModel() {
    var vm = viewModel();
    vm.activate()
        .then( applyBindings(vm) );
}

请注意,当回调返回常规的真实值(数字,对象,字符串)时,这将导致异常。 但是,如果回调不返回任何内容或返回一个函数,则定位起来可能很棘手。

要更正代码,应如下所示:

function applyViewModel() {
    var vm = viewModel();
    vm.activate()
        .then(function() {
            applyBindings(vm);
        });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM