承诺中的决心究竟做了什么?

时间:2017-05-20 00:56:51

标签: javascript promise q

我开始在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;
    };

1 个答案:

答案 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