【问题标题】:.then chaining doesn't work. Why?.then 链接不起作用。为什么?
【发布时间】:2018-08-07 12:33:45
【问题描述】:

我想使用 AJAX 从后端加载数据。 有 4 个 AJAX 请求(我不想使用 jQuery)。 如果所有请求都完成,我将处理接收/加载的数据。

异步伪代码:

  1. 加载客户表
  2. 加载项目表
  3. 加载报价表
  4. 加载阶段表
  5. 现在对数据做一些事情...

我正在学习并尝试使用 .then() 链接的承诺。

如果 AJAX 调用完成,函数 getMySqlTable() 将返回一个承诺:

    function getMySqlTable(theCase){
    return new Promise(function (resolve,reject){
        let data = {header:{case:theCase}};

        //AJAX request
        let ajGetProjectsAsOptions = new AjaxJsonRequest('php/ajax/customerDesk.php',data,function(xmlhttp){
            let response = JSON.parse(xmlhttp.responseText);
            if(response.status){
                switch(theCase){
                    case 'getCustomerTable':
                        customerTable = response.data.customers;
                        resolve(true);
                        break;
                    case 'getProjectTable':
                        projectTable = response.data.projects;
                        resolve(true);
                        break;
                    case 'getOfferTable':
                        offerTable = response.data.offers;
                        resolve(true);
                        break;
                    case 'getPhaseTable':
                        phaseTable = response.data.phases;
                        resolve(true);
                        break;
                }
            }else{
                printMessages(response.message);
                reject(false);
            }
        });
        ajGetProjectsAsOptions.doRequest();
    });
}

以下代码可以正常工作,并且可以满足我的要求:

    getMySqlTable('getCustomerTable')
    .then(()=>getMySqlTable('getProjectTable'))
    .then(()=>getMySqlTable('getOfferTable'))
    .then(()=>getMySqlTable('getPhaseTable'))
    .then(
        function(){
                console.log(customerTable);
                console.log(projectTable);
                console.log(offerTable);
                console.log(phaseTable);
            }
        )

但是如果我想通过添加括号来做更多的事情,那就行不通了。 如果我添加一些括号,所有 .then 将立即执行。为什么?

  getMySqlTable('getCustomerTable')
    .then(()=>{
            getMySqlTable('getProjectTable')
    })
    .then(()=>{
            getMySqlTable('getOfferTable')
    })
    .then(()=>{
            getMySqlTable('getPhaseTable')
    })
    .then(()=>{
            console.log(customerTable);
            console.log(projectTable);
            console.log(offerTable);
            console.log(phaseTable)
    })

有人可以帮我吗?

【问题讨论】:

  • 如果没有{ }.then() 箭头函数回调中的单个表达式会隐式返回getMySqlTable() 结果。使用{ },它就像一个传统的函数体,没有隐式返回值;你需要一个明确的return
  • 还值得注意的是,在您最后一次调用中,您传递(作为回调)一个匿名函数,而不是箭头函数。在这种情况下,您可能会丢失执行上下文。小心!

标签: javascript promise chaining


【解决方案1】:

如果你在回调中使用大括号,它需要你返回一个值。在每次调用中执行“return getMySqlTable(...)”。

【讨论】:

猜你喜欢
  • 2011-07-08
  • 2011-10-26
  • 1970-01-01
  • 2013-05-25
  • 2015-06-24
  • 2015-07-31
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多