2015-09-28 23 views
0

我不確定我期望的內容是否正確,但如果Promise與其他任何JavaScript類相似,則它應該有this上下文。Promise中的此上下文並不涉及內部實例

但下面的代碼讓我感到驚訝。

var promise = new Promise(function (resolve, reject) { 
    console.log(this === window); // Prints true 
}); 

我在這裏錯過了原生Promise的概念嗎?

我的目標是在創建它時將某些屬性附加到承諾對象,並能夠稍後訪問它。

我知道在Promise中傳遞的回調函數不在任何上下文中,並且會像調用普通函數一樣調用。但是,有沒有辦法將財產附加到每個返回的承諾?

this.someProp = someobj.returnVal(); 

更多信息

基本上,我作出的承諾中一個Ajax請求,我想請求對象存儲在承諾讓我能請求時,我用它來abort想。 Promise.prototype

下面是實際的代碼。

var _request; 

const promise = new Promise(function (resolve, reject) { 

    this._request = superagent.get(url) 
    .end((error, res) => { resolve(res); }); // What I expect to work 

    _request = superagent.get(url) 
    .end((error, res) => { resolve(res); }); // But I have no this context 
}); 

Promise.prototype.abort = function() { 
    this._request.abort(); // Can't do this 
} 
+0

你能描述你想要什麼問題使得東西附加到諾言,因爲有可能是解決你的問題,更好的辦法。 – jfriend00

+1

@ jfriend00 _jqXHR_ - 是不是假設jQuery? 'fetch' https://developer.mozilla.org/en/docs/Web/API/Fetch_API可能是答案(IE有一個polyfill) –

+0

是的,我的錯誤。我認爲這是jQuery。請顯示您的實際代碼。也許你需要返回一個既有承諾又有XHR對象的對象,而不僅僅是一個承諾。 – jfriend00

回答

1

這裏返回包含兩個請求對象和承諾,那麼調用者可以使用一個對象,你要我交的想法:

function getInfo(url) { 
    var req = superagent.get(url); 
    var p = new Promise(function(resolve, reject) { 
     req.end(function(error, res) { 
      if (error) return reject(error); 
      resolve(res); 
     }); 
    }); 
    // return an object with both promise and request object in it 
    // so caller can use either 
    return {promise: p, req: req}; 
} 

var ret = getInfo(myURL); 
ret.promise.then(function(res) { 
    // handle response here 
}, function(err) { 
    // handle error here 
}); 

// you could also do this at any time 
ret.req.abort(); 

事實證明,你可以使用相同的結構將請求對象放在這樣的承諾上(儘管我不會推薦它,因爲鏈接承諾會產生新的承諾,因此會損失原始承諾上的定製屬性):

function getInfo(url) { 
    var req = superagent.get(url); 
    var p = new Promise(function(resolve, reject) { 
     req.end(function(error, res) { 
      if (error) return reject(error); 
      resolve(res); 
     }); 
    }); 
    p.req = req; 
    return p; 
} 

或者,你可以把請求對象的承諾(這是比較安全):

function getInfo(url) { 
    var req = superagent.get(url); 
    var p = new Promise(function(resolve, reject) { 
     req.end(function(error, res) { 
      if (error) return reject(error); 
      resolve(res); 
     }); 
    }); 
    req.promise = p; 
    return req; 
} 
+0

我喜歡'req.promise = p;'的方法。讓我看看我是否可以使用它。 –