我开始学习 JavaScript 中的 Promise,但我仍然没有理解它。下面的代码大部分是真实的代码。我已经放置了几个调试器语句,以便程序停止,我可以了解流程的工作原理并检查一些变量。我读过一些关于 Promise 的博客文章,但我仍然无法理解所有内容。这是来自一个使用 AngularJS 和 q 库的应用程序。
几个问题:
1- deferred.Resolve() 到底做了什么?它对response.data做了什么?当我检查“deferred”对象及其“promise”对象时,我看不到任何response.data 的痕迹。
2- 当我在调试器 #1 之后恢复执行时,我认为 http post 语句会运行,但执行跳转到 return 语句。我想这就是 promise 发生的地方,并且该帖子将在未来发生?
3- 我如何知道函数返回时何时发布?调用者将得到返回 promise ,调用者期望用它做什么?
this.GetData = function()
{
var data = blahblah;
var deferred = this.$q.defer();
debugger; //1
this.$http.post(someurl, data,
{
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
handleErrors: false
})
.then(function(response) {
debugger; //2
(domesomething...)
deferred.resolve(response.data);
},
function(error) {
(logerror...)
deferred.reject(error);
});
debugger; //3
return deferred.promise;
};
最佳答案
在包装回调样式代码时,使用 q.defer()
(显式创建 Promise)是合适的,“promisifying”...
this.timeoutWithAPromise = function(msec) {
let defer = q.defer();
setTimeout(() => defer.resolve(), msec);
return defer.promise;
};
前面说:“创建一个 promise 并立即返回它。该 promise 将在 msec
过去后实现。
问题 1:resolve()
履行 promise ,调用使用 then()
设置的任何函数,并将传递给解析的任何参数传递给它。
问题 2:你说得对,异步操作已开始,并立即返回完成的 promise 。
问题 3a:一旦进行该调用,帖子将在另一个线程上开始(或者在我的示例中超时将开始)。它将继续与此调用线程上的执行同时执行,直到完成为止,您从问题 1 中了解到,这是通过解析 Promise、调用它的 then()
来完成的。
问题 3b:调用者如何处理返回的 Promise?向其附加一个您希望在完成后运行的 block ,可能是其他异步操作。以我为例...
let self = this;
self.timeoutWithAPromise(1000).then(()=> {
console.log('1000msec have passed');
return self.timeoutWithAPromise(1000);
}).then(()=> {
console.log('now, another 1000msec have passed');
// ...
重写你的例子,意识到 $http 已经符合 promise ......
var data = blahblah;
let headers = { 'Content-Type': 'application/x-www-form-urlencoded' };
let config = { headers: headers, handleErrors: false };
let httpPromise = this.$http.post(someurl, data, config).then((response)=> {
console.log('got a response. tell our caller about it');
return response.data;
}).catch((error)=>
console.log('got an error. either handle it here or throw it');
throw error;
});
// this is important: return the httpPromise so callers can chain off of it
return httpPromise;
现在调用者可以说:
let promiseToDoEvenMore = this.GetData().then((data)=> {
console.log(data);
return this.GetMoreData(); // etc.
});
return promiseToDoEvenMore; // and so on
关于javascript - Promise 中的Resolve 到底有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44080855/