【问题标题】:Struggling with Q.js promises与 Q.js 的承诺作斗争
【发布时间】:2014-06-13 00:20:27
【问题描述】:

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

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

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

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

激活 -

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);
        }
    };

对于为什么这个承诺不起作用的任何帮助,以及任何解决它的过程,我都可以在下次遇到这个问题时帮助自己。

【问题讨论】:

    标签: javascript knockout.js breeze promise q


    【解决方案1】:

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

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

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

    正确的代码应该是这样的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      • 2015-12-07
      • 2013-04-02
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多