我开始在Javascript中了解承诺,但我仍然没有理解它。下面的代码主要是真实的代码。我已经放置了几个调试器语句,所以程序停止了,我可以理解流程如何工作并检查一些变量。我已经阅读了一些关于承诺的博客文章,我仍然无法理解一切。这是来自使用AngularJS和q库的应用程序。
几个问题:
1- deferred.Resolve()究竟做了什么?它对response.data做了什么?当我检查'deferred'对象及其'promise'对象时,我看不到response.data的任何痕迹。
2-当我在调试器#1之后恢复执行时,我认为http post语句会运行但是执行跳转到return语句。我想这就是承诺跳进来的地方,这个帖子将来会发生什么?
3-如何在函数返回时知道帖子何时发生?调用者将获得返回承诺,调用者期望使用它做什么?
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;
};
答案 0 :(得分:0)
在包装回调样式代码时,使用q.defer()
(显式创建承诺)是合适的,“promisifying”......
this.timeoutWithAPromise = function(msec) {
let defer = q.defer();
setTimeout(() => defer.resolve(), msec);
return defer.promise;
};
上述说法:“立即制定承诺并将其退回。当msec
过去时,承诺将得到履行。
问题1:resolve()
履行承诺,调用用then()
设置的任何函数,并传递任何传递给它的参数来解析。
问题2:您说得对,异步操作已经开始,并且会立即返回对其完成的承诺。
问题3a:一旦调用完成,帖子将在另一个线程上开始(或者在我的例如,超时将开始)。它将继续与此调用线程上的执行同时进行,直到它完成,您从问题1中理解,通过解析promise,调用它then()
来完成。
问题3b:回复承诺的来电者是什么?在完成时附加一个您希望运行的块,可能还有其他异步操作。以我的榜样......
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已经符合承诺......
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