【问题标题】:How to return to the previous function by setting a flag using promises如何通过使用 Promise 设置标志来返回上一个函数
【发布时间】:2018-06-28 01:50:16
【问题描述】:

我正在使用 Promise 进行多个 ajax 调用,如何通过设置标志返回到上一个函数。我有一个保存函数,其中我正在调用一个方法if(!x()){return;} 我想从 x 函数中返回一些标志我使用 promises 进行 ajax 调用,因为我需要等待多个 ajax 请求响应,并且取决于它我有提交表格。请检查fiddleFiddle

【问题讨论】:

  • 听起来你正试图将一个异步函数的值返回给调用它的代码。这不可能。 (小提琴没用)
  • 测试if (!this.refValid()) { ... } 证明@KevinB 是正确的。 refValid() 做了一堆异步的东西,应该返回一个承诺(它可以在不需要 Deferred 的情况下做到这一点)。这个问题是stackoverflow.com/questions/14220321/… 回答的一个相当广泛的例子

标签: ajax promise extjs5 deferred extjs6-classic


【解决方案1】:

除非你熟悉 Promises,否则这种事情简直就是一场噩梦。

据我所知,你想要这样的东西:

Ext.define('MyApp.view.MyModel1FormViewController', {
    'extend': 'Ext.app.ViewController',
    'alias': 'controller.mymodel1form',
    'save': function (button, e, eOpts, processed) {
        var me = this;
        // enable/disable "submit" button based on Promise-wrapped result from refValid()
        return this.refValid().then(function(bool) {
            // success handler
            me.onSubmit(button, e, eOpts, bool);
            Ext.Msg.alert('save: success');
        }, function (e) {
            // error handler
            // me.onSubmit(button, e, eOpts, ???); true|false or maybe just leave the button in its current state?
            Ext.Msg.alert('save: errors');
            // throw e; // rethrow the error to inform save()'s caller.
        });
    },
    'refValid': function (button, e, eOpts) {
        var detailStore = this.getView().up('panel').lookupReference('list').getStore(),
            jde = this.getView().up('panel').lookupReference('headerform').lookupReference('jdeno').getValue();
        var promises = detailStore.data.items.map(function (r) { // ???
            return r.get('refno') || null;
        }).filter(function (x) {
            return !!x; // filter out any nulls
        }).map(function (customerInvoiceDebitNo) {
            return Ext.Ajax.request({
                'url': 'data1.json',
                'timeout': 120000,
                'method': 'GET',
                'params': {
                    'addressNumber': jde,
                    'documentNumber': customerInvoiceDebitNo
                },
                'customerInvoiceDebitNo': customerInvoiceDebitNo
            }).then(function (response) {
                if (Ext.decode(response.responseText).data.length === 0) {
                    return false; // null
                } else {
                    Ext.Array.remove(customerInvoiceDebitNo); // maybe not necessary?
                    return true; // not null
                }
            });
        });
        return Ext.Promise.all(promises).then(function (results) { // results is array of booleans
            // Scan the results to check whether or not all are `true`,
            // and return <boolean>.
            return results.reduce(function (prev, current) {
                return prev && current;
            }, true);
        });
    }
});

【讨论】:

  • 感谢漫游者!我尝试将您的代码放在小提琴中,但出现了一些错误,您可以看看这个fiddle.sencha.com/#view/editor&fiddle/2c4e
  • 答案已编辑。它现在一直运行到“保存:成功”。我不知道如何测试“保存”是否真的发生了。
猜你喜欢
  • 2023-03-16
  • 2014-04-27
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
  • 2021-06-23
相关资源
最近更新 更多