【发布时间】:2015-11-24 06:08:32
【问题描述】:
promise then return a specified promise 给出以下代码 sn-p:
function get(url) {
return new Promise(function(resolve, reject) {
var req = new XMLHttpRequest();
req.open('GET', url);
req.onload = function() {
if (req.status == 200) {
resolve(req.response);
}
else {
reject(Error(req.statusText));
}
};
req.onerror = function() {
reject(Error("Network Error"));
};
req.send();
});
}
这个函数可以如下使用:
get('story.json').then(function(response) {
console.log("Success!", response);
}, function(error) {
console.error("Failed!", error);
});
我想用promise加载多个url,比如
get('a.json').get('b.json')
// or get('a.json').then().get('b.json')
我已经以其他方式实现了它。但据我了解,Promise 无法完成这项工作。真的吗?
添加
事实上,我实现了一个类似的库来帮助在浏览器中执行动态脚本:
Loader = (function() {
var load_cursor = 0;
var load_queue;
var loadFinished = function() {
load_cursor ++;
if (load_cursor < load_queue.length) {
loadScript();
}
}
function loadError (oError) {
console.error("The script " + oError.target.src + " is not accessible.");
}
var loadScript = function() {
var url = load_queue[load_cursor];
var script = document.createElement('script');
script.type = "text/javascript";
if (script.readyState){ //IE
script.onreadystatechange = function(){
if (script.readyState == "loaded" ||
script.readyState == "complete"){
script.onreadystatechange = null;
loadFinished();
}
};
} else { //Others
script.onload = function(){
loadFinished();
};
}
script.onerror = loadError;
script.src = url+'?'+'time='+Date.parse(new Date());
document.body.appendChild(script);
};
var loadMultiScript = function(url_array) {
load_cursor = 0;
load_queue = url_array;
loadScript();
}
return {
load: loadMultiScript,
};
})(); // end Loader
// load...
Loader.load(['http://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.0/jquery.min.js', './my.js']);
【问题讨论】:
-
你已经接近了。你需要学习如何正确使用
then,你会被设置 -
.get不是 promise 的方法,它只是一个普通的函数。听起来你想要Promise.all([get('a'), get('b')]).then(function([aresult, bresult]) { … }); -
你能告诉我们你的“其他方式”吗?很难确定您真正想要什么,因为“加载多个 url”是微不足道的,而且您错误的承诺示例也无济于事。
-
不应该将
loadMultiScript附加到load_queue,将load_cursor重置为0并开始第一个loadScript()(然后让@987654335 @做剩下的),而不是在一个循环中多次调用loadScript()?这将并行加载每个,而不是按顺序。 -
我想你会想阅读你链接的文章中的html5rocks.com/en/tutorials/es6/promises/#toc-promises-queues章节
标签: javascript promise