虽然我正在使用AngularJS中的HTTP promise对象,但我并没有清楚地了解HTTP promise对象实际上是什么,以及AngularJS中HTTP promise对象和传统对象之间的区别是什么!
请问有人解释一下吗?
答案 0 :(得分:9)
Promise是异步操作的概念。基本上它代表了一个从现在到未来的任何时刻都可以使用的对象。
它有三种状态:
使用两种方法处理Promise的状态,然后是()和catch()。
then()如果成功则从异步调用中提供预期的对象,catch()将允许您处理错误。
您可以使用Promise的情况是您进行网络通话时,例如:
getData(): Promise<Array<string>> {
return this.http.get("http://a-test-api.com/api/getdata").toPromise();
}
然后你就这样使用它:
this.getData().then(function (stringArray) {
self.data = stringArray;
});
您可以在此处找到有关此概念的更多信息:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise
答案 1 :(得分:3)
承诺是一个概念。这是一个关于AngularJS Promises的问题,它与其他版本略有不同,但跨库的概念基本相同。
如果您知道这是什么,请跳过它并阅读下一个标题,否则:
当你有代码时,它通常按顺序运行,如下所示:
object.method() // First,
variable = "something"; // Second,
for(var i=0; i<2; i++) {
resp = object.makeHttpRequest();
console.log(resp.data + " was #" + i);
} // Third,
console.log("Done"); // Last.
每个步骤都在前一个完成后执行。当for
循环花费很长时间(想象HTTP请求需要很长时间)时,这可能是一个问题。请求将挂起整个进程,直到HTTP请求完成。非常糟糕。
Node.js默认使用回调模式处理此问题。当您调用阻止的功能(需要很长时间,比如在磁盘上读取文件或发出HTTP请求)时,您会注册一个回调函数精加工。当完成时,它将apply
函数与阻塞函数中的数据一起使用。这允许您在阻塞函数完成时运行其他代码。
正如许多Node.js开发人员会告诉你的那样,这段代码可能非常混乱,非常快。相反,AngularJS(和其他库)将在代码完成时返回Promise。它允许您使用Promise Pattern。
Promise在概念上类似于回调,但更清晰,允许更大程度的控制。考虑一下:
var url = getUrlFunction();
makeHttpRequest(url, function onResponse(data) {
dataHandler(data);
console.log("done");
}, function onError(err) {
errHandler(err);
console.log("uh oh");
});
showTheUserWeAreLoading();
// Or in node.js
var url = getUrlFunction();
makeHttpRequest(url, function onResponse(err, data) {
(err) ? handleErr(err): null;
dataHandler(data);
console.log("done");
});
showTheUserWeAreLoading();
如果满足, showTheUserWeAreLoading
函数(有时)会在HTTP请求之前发生,这不是很直观。在重新读取您自己的代码时,这还有很多不足之处。
相同的代码,但makeHttpRequest
返回一个承诺:
var url = getUrlFunction(), prom = makeHttpRequest(url);
showTheUserWeAreLoading();
prom.then(function onSuccess(data) {
dataHandler(data);
console.log("done");
}, function onError(err) {
errHandler(err);
console.log("uh oh");
});
promise对象有助于跟踪操作的状态。您可以在操作达到以下两种状态之一时分配处理程序:已实现或已拒绝。
应该注意makeHttpRequest
是AngularJS中的$http()
或jQuery中的$.ajax
的替代。在创建承诺标准in the ECMAScript standard之前,每个库(和库版本)都有自己的意见,您应该/可以使用哪种模式。 AngularJS以前使用.success(<function>).error(<function>)
命名模式,而jQuery使用.done(<function>).fail(<function>)
。这些命名方案很久以前就被折旧了,因此使得库之间的当前差异变得不明显(谢谢ECMAScript)。
答案 2 :(得分:1)
[Agent Smith]
[Morpheus]
[Trinity]
[Neo]
API基于$http
服务公开的延迟/承诺API。
1 $q
2 .then(successCallback, [errorCallback], [notifyCallback])
3 .catch(errorCallback) – shorthand for promise.then(null, errorCallback)