从 Bluebird Promise 对象访问 jQuery $.get URL

Acces to jQuery $.get URL from Bluebird Promise object

我将 Bluebird promises 与 jQuery $.get() 一起使用,如下所示:

var p = Promise.resolve($.get(url.address, url.options, 'json')).then(function (result) {...

并处理它们:

p.timeout(100).catch(Promise.TimeoutError, function (error) {
    console.log(p); // here I want to log in that Promise took too long to execute and access what user actually asked for
});

如何在上面的 catch 块中使用选项访问 $.get URL?请参阅代码中的注释 - 当我超时时,我需要知道用户在他的请求中要求什么。

提供的示例已简化,我将 Promise 传递给另一个函数并在其中访问它;我得到的是:

Promise {
    _bitField: 201326593,
    _cancellationParent: undefined,
    _fulfillmentHandler0: undefined,
    _progressHandler0: undefined,
    _promise0: undefined,
    _receiver0: undefined,
    _rejectionHandler0: undefined,
    _settledValue: SubError,
    __proto__: Promise
}

我不是在问如何在本质上获得 $.get() url 而是如何在 Bluebird 承诺的范围内获得它。

你不应该直接访问 promise 对象,让框架来处理它。如果你想传递参数,你可以 return 一个 promise 中的参数值(但它只会在下一个 then 中保留)或者你可以使用 promise 的范围: https://github.com/petkaantonov/bluebird/blob/master/API.md#binddynamic-thisarg---promise

var result = Promise.bind({url: url})
.then(function(){
    return Promise.resolve($.get(url.address, url.options, 'json'));
}
.then(function() {
    // access your url in then
    console.log('then: ', this.url);
    return Promise.reject();
})
.catch(function(err) {
    // access your url in catch
    console.log('catch: ', this.url);
});