2016-04-01 4 views
2

Я пытаюсь promisify the native XHR,Как сделать XHR «обещаемым» и вернуть объект XHR?

теперь вот проблема, когда я использую следующий код:

function request(method, url) { 
    return new Promise(function (resolve, reject) { 
     var xhr = new XMLHttpRequest(); 
     xhr.open(method, url); 
     xhr.onload = resolve; 
     xhr.onerror = reject; 
     xhr.send(); 
    }); 
} 

он возвращает обещание вместо объекта XHR,

, так что я не могу использовать что-то вроде xhr.abort() таким образом:

xhr = request('GET', 'http://google.com').then(function (e) 
{ 
    // ...code... 
}, function (e) 
{ 
    // ...code... 
}); 

// When user press the stop button. 
xhr.abort(); 

есть в любом случае, чтобы сделать его возвращает объект XHR и еще ке ep это обещание?

Редактировать: Это не спрашивает, как обещать объект XHR, но как сделать «многообещающий» объект XHR вернуть объект XHR вместо Promise.

+2

Связанный или дубликат: http://stackoverflow.com/questions/30008114/how-do-i-promisify-native-xhr – k0pernikus

+0

Идея могла бы вдохновить AngularJS API: http: //stackoverflow.com/ вопросы/13928057/как к отмене-ан-HTTP-запрос-в-angularjs – pdem

ответ

1

Вам нужно будет вернуть ссылку на необработанный XHR или даже метод abort().

Например, вернуть что-то вроде ...

return { 
    promise: promise, 
    xhr: xhr 
}; 

Затем вызывающий код может использовать request().xhr.abort().

Очевидно, что вам нужно будет создать эти 2 переменные и создать XHR за пределами обратного вызова Promise.

Если вы действительно хотели, чтобы он работал так, как вы описали, вы можете установить свойство объекта Promise, но это может быть запутанный API.