带有飞行前请求的 Angularjs $q.all 在 OPTIONS 请求后解析

Posted

技术标签:

【中文标题】带有飞行前请求的 Angularjs $q.all 在 OPTIONS 请求后解析【英文标题】:Angularjs $q.all with pre-flight request resolves after OPTIONS request 【发布时间】:2016-06-26 05:58:39 【问题描述】:

我有多个删除请求,前面有一个 OPTIONS 飞行前请求。但是在OPTIONS 请求之后,控件进入$q.all 的then。这是我的代码:

companyMasterC.confirmDelete = function(ev, text) 
     simpleDialog.verifyDelete(ev, text).then(function() 
         companyMasterC.deletePromise = companyMasterC.deleteSelected().then(function(response) 
              companyMasterC.getCompanies();
          , function(error) 
                 console.log(error);
          );
     );
;

companyMasterC.deleteSelected = function()
   var promises = companyMasterC.selectedRows.map(function(selectedRow) 
       return company.delete(id:selectedRow.id);
   );
   return $q.all(promises);
;

下面是“网络”选项卡中发生的情况:首先,执行OPTIONS 请求,然后执行GET 请求companyMasterC.getCompanies();DELETE 请求被执行时应该执行。并且在GET请求DELETE请求被执行之后。

【问题讨论】:

【参考方案1】:

改变

return company.delete(id:selectedRow.id);

return company.delete(id:selectedRow.id).$promise;

修改代码:

companyMasterC.confirmDelete = function(ev, text) 
     simpleDialog.verifyDelete(ev, text).then(function() 
         companyMasterC.deletePromise = companyMasterC.deleteSelected().then(function(response) 
              companyMasterC.getCompanies();
          , function(error) 
                 console.log(error);
          );
     );
;

companyMasterC.deleteSelected = function()
   var promises = companyMasterC.selectedRows.map(function(selectedRow) 
       return company.delete(id:selectedRow.id).$promise;
   );
   return $q.all(promises);
;

【讨论】:

这个问题解决了,但是 company.delete(id:selectedRow.id) 已经是一个承诺。那么为什么要添加 $promise。

以上是关于带有飞行前请求的 Angularjs $q.all 在 OPTIONS 请求后解析的主要内容,如果未能解决你的问题,请参考以下文章

Rails、REST 架构和 HTML 5:带有飞行前请求的跨域请求

如何从 Web 服务提供飞行前请求

为啥这个简单的 CORS 请求会进行飞行前选项检查

我们应该在发送响应时关闭飞行前 Cors 请求的连接吗?

Axios 承诺解决飞行前请求响应,这使得关联的 GET 与应用程序的其余部分无序执行

AngularJS 的 Preflight OPTIONS 请求不适用于 Chrome?