我想在我的前端应用程序中使用(本机)promise来执行XHR请求,但没有大型框架的所有功能。
我希望我的XHR返回的希望,但是,这并不工作(给我:Uncaught TypeError: Promise resolver undefined is not a function
)
function makeXHRRequest (method, url, done) {
var xhr = new XMLHttpRequest();
xhr.open(method, url);
xhr.onload = function() { return new Promise().resolve(); };
xhr.onerror = function() { return new Promise().reject(); };
xhr.send();
}
makeXHRRequest('GET', 'http://example.com')
.then(function (datums) {
console.log(datums);
});
我假设您知道如何发出本机XHR请求
由于任何支持本机Promise的浏览器也将支持xhr.onload
,因此我们可以跳过所有的onReadyStateChange
tomfoolery。让我们退后一步,从使用回调的基本XHR请求函数开始:
function makeRequest (method, url, done) {
var xhr = new XMLHttpRequest();
xhr.open(method, url);
xhr.onload = function () {
done(null, xhr.response);
};
xhr.onerror = function () {
done(xhr.response);
};
xhr.send();
}
// And we'd call it as such:
makeRequest('GET', 'http://example.com', function (err, datums) {
if (err) { throw err; }
console.log(datums);
});
欢呼!这不涉及任何非常复杂的事情(例如自定义标头或POST数据),但足以使我们前进。
我们可以这样构造一个承诺:
new Promise(function (resolve, reject) {
// Do some Async stuff
// call resolve if it succeeded
// reject if it failed
});
promise构造函数采用一个函数,该函数将传递两个参数(我们称它们为resolve
和reject
)。您可以将它们视为回调,一个代表成功,另一个代表失败。示例很棒,让我们makeRequest
使用此构造函数进行更新:
function makeRequest (method, url) {
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.open(method, url);
xhr.onload = function () {
if (this.status >= 200 && this.status < 300) {
resolve(xhr.response);
} else {
reject({
status: this.status,
statusText: xhr.statusText
});
}
};
xhr.onerror = function () {
reject({
status: this.status,
statusText: xhr.statusText
});
};
xhr.send();
});
}
// Example:
makeRequest('GET', 'http://example.com')
.then(function (datums) {
console.log(datums);
})
.catch(function (err) {
console.error('Augh, there was an error!', err.statusText);
});
现在,我们可以利用promise的功能,将多个XHR调用链接起来(并且.catch
将在每次调用中触发错误):
makeRequest('GET', 'http://example.com')
.then(function (datums) {
return makeRequest('GET', datums.url);
})
.then(function (moreDatums) {
console.log(moreDatums);
})
.catch(function (err) {
console.error('Augh, there was an error!', err.statusText);
});
我们可以进一步改进它,添加POST /PUT参数和自定义标头。让我们使用带有签名的options对象而不是多个参数:
{
method: String,
url: String,
params: String | Object,
headers: Object
}
makeRequest
现在看起来像这样:
function makeRequest (opts) {
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.open(opts.method, opts.url);
xhr.onload = function () {
if (this.status >= 200 && this.status < 300) {
resolve(xhr.response);
} else {
reject({
status: this.status,
statusText: xhr.statusText
});
}
};
xhr.onerror = function () {
reject({
status: this.status,
statusText: xhr.statusText
});
};
if (opts.headers) {
Object.keys(opts.headers).forEach(function (key) {
xhr.setRequestHeader(key, opts.headers[key]);
});
}
var params = opts.params;
// We'll need to stringify if we've been given an object
// If we have a string, this is skipped.
if (params && typeof params === 'object') {
params = Object.keys(params).map(function (key) {
return encodeURIComponent(key) + '=' + encodeURIComponent(params[key]);
}).join('&');
}
xhr.send(params);
});
}
// Headers and params are optional
makeRequest({
method: 'GET',
url: 'http://example.com'
})
.then(function (datums) {
return makeRequest({
method: 'POST',
url: datums.url,
params: {
score: 9001
},
headers: {
'X-Subliminal-Message': 'Upvote-this-answer'
}
});
})
.catch(function (err) {
console.error('Augh, there was an error!', err.statusText);
});
。
问题内容: 我正在尝试通过创建一个接受文件路径并将文本的每一行转换为char数组的函数来编写一个简单的文本文件阅读器,但是它不起作用。 这是怎么了? 从先前的版本中稍稍更改了代码后,这似乎仍然不起作用,现在给了我一个例外101。 我已经在Firefox上对其进行了测试,并且可以工作,但是在Google Chrome中它却无法工作,并且一直给我一个异常101。如何使它不仅可以在Firefox上而且还
/aaaaa/static/img/zhexian.41eafbf5.png 转 这种格式 data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANIAAABjCAYAAAGZCG4EAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQA
问题内容: 假设我有一个如下所示的javascript对象: 我将其字符串化以转换为JSON。如何将此JSON保存到本地文本文件,以便可以在记事本等中打开它。 问题答案: Node.js: 浏览器(webapi):
如下,有什么办法在编辑器层面(比如vscode)保证代码安全么? 人总是会粗心大意的,if(1 == value)写起来也不符合直觉…… 或者有一些小技巧讨论一下也行。 TS伪代码如下
我当前正在创建一个脱机HTML页面,该页面显示带有复选框的元素列表。但是如果我关闭并重新打开页面,我的复选框都是未选中的(正常)。因此,我使用“a”元素创建了一个“save”按钮,如下所示: 我将我的数据保存为一个js文件,并且这个文件在我的HTML中是打开的,但是我想知道两件事: 1-是否有一种方法可以在一个特定的位置进行下载,而不需要浏览器询问下载文件的位置,如果已经有一个同名文件,则覆盖上一
我们有一个在Apache和nginx上运行的Angular 8应用程序。我们使用带有和的Basic Auth保护此应用程序。 不幸的是,由于对服务器的请求被基本身份验证阻止,应用程序无法加载,Angular无法加载这些文件: 此 路 不通http://root/polyfills-es2015.js因为这是一个跨来源请求,所以不要求提供凭据 已阻止http://root/runtime-es201