我们有一个使用 Typescript 构建的 Angular 1.5 应用程序,我正在尝试找出处理 ng.IPromise 与 Promise(ES6 Promise)的最佳方法。我的偏好是只处理 ES6 Promise 类型。是否有一种优雅的方法来覆盖所有 Angular-JS 和 Angular-Material(也包括)接口以使用 es6 Promise?
我能想到的选项:
澄清
角度应用程序使用的底层 Promise 实现仍然是 $q (不过,我也在应用 Angular-bluebird-promises)。我只是想简化/整合涉及的 Typescript 接口。
我启动了一个简单的 Angular2 Electron 应用程序,并且有一个查询本地 SQL Server 数据库的服务方法。到目前为止一切正常。现在我试图获取对我的组件的服务数据库调用的结果并以某种方式显示它。
问题是查询逻辑写的比较多的是回调语法:
sql.query(sqlString, (err, result) => {
...
callback(result);
...
});
Run Code Online (Sandbox Code Playgroud)
我很难重写它以返回承诺,因为结果始终位于查询命令函数的结果参数内。我的组件如下所示:
export class LinkDocRetriever {
constructor(private myService: MyService) { }
results = "";
loadMyData(id: number): void {
let tcData = this.myService.getMyData();
tcData.forEach(element => {
this.results += element.FileName + " " + "....\n";
});
};
}
Run Code Online (Sandbox Code Playgroud)
我的服务如下所示:
import { Injectable } from "@angular/core";
import * as sql from "mssql";
@Injectable()
export class MyService {
getMyData():Array<MyItem> {
let myData:Array<MyItem> = [];
let config = { …Run Code Online (Sandbox Code Playgroud) 我有一个访问资源的控制器,Tag如下所示:
$scope.tags = Tag.query();
Run Code Online (Sandbox Code Playgroud)
解析为东西像这样:
$scope.tags = [
{ name: "tag1", label: "Tag1" },
{ name: "tag2", label: "Tag2" },
{ name: "tag3", label: "Tag3" },
{ name: "tag4", label: "Tag4" },
];
Run Code Online (Sandbox Code Playgroud)
对于此特定控制器,返回的标记应具有其他属性"active": true,例如{ name: "tag1", label: "Tag1", active: true }.
一旦解决了添加此布尔值,我如何迭代返回的promise?
我试图找到一种方法来突破AngularJS代码中的承诺链.显而易见的方法是返回一个对象,然后检查链中每个"then"函数的有效性.
我想找到一种更优雅的方式来突破当时的链条.
我想返回一个$ q实例,这样如果客户端没有使用拒绝处理程序调用'then',那么默认运行.
例如,假设默认为 alert(1)
然后mypromise.then(function(result){...})将提醒1,但mypromise.then(null, function(reason){alert(2)})会提醒2
我需要将必要的HMAC标头附加到请求中.这应该不是很困难,但我开始感到沮丧.以下代码有什么问题.我正在进行的实际http调用; 我自己运行了这个调用,它返回了必要的数据.它在拦截器内部不起作用.
我只是希望在为此拦截器添加白名单或黑名单以及其他可自定义数据之前使当前实现正常工作.这不是关于hmac的问题,而是有了承诺.
此拦截器中的错误是整个承诺行从$ http(...)开始.当我删除此块并按原样使用它(减去承诺执行)它工作正常.一旦我取消注释该线就会卡在一个循环中并崩溃铬.我读过的每个地方都说它是如何完成的,但这显然不起作用.
function requestInterceptor(config){
var $http = $injector.get('$http');
var deferred = $q.defer();
$http.get(hmacApiEndpoint, {cache: true}).then(function(data){
console.log('HMAC - Success', data)
deferred.resolve(config)
}, function(config){
console.log('HMAC - Error', config)
deferred.resolve(config)
})
return deferred.promise;
}
return {
request: requestInterceptor
};
Run Code Online (Sandbox Code Playgroud)
这是否与angulars $ http promise与'$ q'不同的实现有关?
javascript angularjs angular-http-interceptors angular-promise
我已经使用该$q服务与Angular建立了一个承诺.
var get = function() {
var defer = $q.defer();
setTimeout(function() {
defer.resolve('test');
}, 1000);
return defer.promise;
}
Run Code Online (Sandbox Code Playgroud)
当我调用此函数时,它返回预期的数据,如下所示:
var promise1 = api.get().then(function(data){
console.log(data); //logs test
});
var promise2 = api.get().then(function(data){
console.log(data); //logs test
});
Run Code Online (Sandbox Code Playgroud)
但是当我使用这个all方法时,我得到一个包含undefined两次的数组.
$q.all([promise1, promise2]).then(function(data){
console.log(data); //logs [undefined, undefined];
});
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么吗?
我将服务返回的承诺转换为控制器时出现问题.我想要的是从promise中包含的数据创建一个JSON对象数组.这是我在控制器中收到的内容:

以下是用于打印该数据的行:
console.log("controller unmatched: ", unmatched.getData(sFilter));
Run Code Online (Sandbox Code Playgroud)
这里"无与伦比"是服务,而getData()就是它的功能.
谢谢!
我试着爱可信图书馆angularjs,当我看到改变我很惊讶$scope被角检测到爱可信回调。我以为我必须打个电话$apply,例如在使用时setTimeout。
// axios example
axios.get(url).then((response) => {
// Here I don't need $apply, why??
$scope.axiosResult = response.data;
});
// setTimeout example
setTimeout(() => {
// Here I need $apply for the timeoutResult to appear on the HTML
$scope.$apply(() => $scope.timeoutResult = {message: "timeout!"});
}, 2000)
Run Code Online (Sandbox Code Playgroud)
您知道为什么$apply在axios中不需要吗?
编辑:
georgeawg的评论帮助我看到了我$http在其他地方使用的信息,因此我猜测由触发的摘要循环$http也有助于axios回调被“消化”。
这是我的代码:
public resetDefaults() {
return new Promise ((resolve, reject) => {
resolve(
this.resetFilters()
)
}).then(()=> {return this.cachedFilters});
}
private resetFilters() {
}
Run Code Online (Sandbox Code Playgroud)
该this.resetFilters()是给我:
类型'void'的参数未分配给类型'{} |的参数。PromiseLike <{}>'
我知道如果我这样做:
private resetFilters(): Promise<any> {
}
Run Code Online (Sandbox Code Playgroud)
它将消除该错误,但随后我必须在该方法中创建一个新的Promise。我只希望能够调用一个函数而不必添加任何其他promise。
我确实需要的无极resetDefaults()虽然
angular-promise ×10
angularjs ×8
javascript ×6
angular ×2
typescript ×2
asynchronous ×1
axios ×1
break ×1
es6-promise ×1
json ×1
mapping ×1
promise ×1
q ×1