AngularJS 中的 HTTP 承诺对象是什么?

What is the HTTP promise object in AngularJS?

尽管我在 AngularJS 中使用 HTTP promise 对象,但我并不清楚 HTTP promise 对象到底是什么,以及 HTTP promise 对象和传统对象之间的区别AngularJS!

中的对象

有人能解释一下吗?

Promise 是异步操作的概念。基本上,它代表一个对象,从现在到未来的任何时候都可以使用。

它有三种状态:

  • 待定
  • Fulfilled(成功完成)
  • 已拒绝(失败)

您使用两种方法处理 Promise 的状态,then() 和 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

$http API 基于 $q 服务公开的 deferred/promise API。

1.then(successCallback, [errorCallback], [notifyCallback])

2.catch(errorCallback) – shorthand for promise.then(null, errorCallback)

3.finally(callback, notifyCallback)

$q promise method

承诺是一个概念。这是AngularJS Promises上的一道题,跟其他promises有点不一样,但是跨库的概念基本是一样的

什么是异步进程?

如果你知道这是什么,请跳过它并阅读下一个header,否则:

当你有代码时,它通常 运行 按如下顺序排列:

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(和其他库)将为您 return 您提供代码何时完成的 Promise。它允许您使用 Promise Pattern.

我知道异步是什么

Promises 在概念上类似于回调,但更清晰并且允许更大程度的控制。考虑一下:

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 return 一个承诺:

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");
});

承诺 object 有助于跟踪操作的状态。当操作达到以下两种状态之一时,您可以分配处理程序:已完成或已拒绝。

需要注意的是,makeHttpRequest是AngularJS中的$http()或jQuery中的$.ajax的stand-in。在创建 promises 标准之前 in the ECMAScript standard,每个库(和库版本)对您 should/can 使用哪种模式都有自己的看法。 AngularJS 以前使用 .success(<function>).error(<function>) 命名模式,而 jQuery 使用 .done(<function>).fail(<function>)。这些命名方案在很久以前就已经过时了,因此使得库之间的当前差异不明显(感谢 ECMAScript)。