javascript - Promise 中的Resolve 到底有什么作用?

标签 javascript promise q

我开始学习 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/

相关文章:

javascript - 如何让函数返回多个值

AngularJS Promises - 模拟 http promise

javascript - CoffeeScript/JavaScript - promise 与 Source Maps 兼容?

javascript - 使用 reduce 串行链接 Javascript promise 时的范围问题

javascript - 在模块之间共享 promise 与拥有多个 promise

javascript - Gmail API : unable to request unread message

javascript - jQuery deferred.notify 不工作

javascript - javascript 是否使用某种隐式 "noop"调用?

javascript - 将 catch block 添加到 Promise 会返回待处理而不是被拒绝

javascript - 为什么 jQuery 的 Promise.reject 不起作用?