我有一个url数组:
var myurls = ["url1", "url2", "url3"];
我想逐个获取所有网址。
我知道如何手动完成,但不知道数组
fetchUrl1(myurls[0])
.then(function(){
return test_func(myurls[1]);
})
.then(function(){
return test_func(myurls[2]);
})
.then(function() {
console.log('done');
});
我如何动态地做到这一点?
答案 0 :(得分:-1)
在评论中看起来有一些重复的候选人,但是这里有一个简明的答案,根据具体要求提供了几种方法:
如果使用promises来获取串联的URL,则可以使用asyncjs'eachSeries
(如果要使用节点式回调)或bluebird的Promise.each
。如果你不需要系列中的提取,但它们都可以并行获取,asyncjs'each
和ES6的Promise.all
将允许你这样做。
这两种方法都将函数作为输入,因此您可以将原始URL数组和map
它们放到所需的输入函数中,最终输出将是一个结果数组(我假设响应来自URL提取)。
编辑:包括Promise.each的示例代码
var myurls = ["url1", "url2", "url3"];
var myPromisifiedFetchRequests = myurls.map(url => fetch(url));
Promise.each(myPromisifiedFetchRequests).then(myFetchedResults => console.log(myFetchedResults));
答案 1 :(得分:-1)
你可以使用这样的东西。它构建了一系列promise,它将以原始数组的顺序解析所有结果的数组。如果你想玩它,这就是一个JSFiddle:https://jsfiddle.net/53r4oxyh/
//dummy http.get
function HttpGet(url) {
return new Promise((resolve, reject) => {
console.log(`fetching ${url}`);
setTimeout(function(){
resolve(`done: ${url}`);
}, Math.floor(Math.random()*500));
});
}
function buildPromiseChain(items, func) {
var promise = new Promise((resolve, reject) => {
resolve([]);
});
items.forEach((item) => {
promise = promise.then((result) => {
return func(item).then((itemResult) => {
result.push(itemResult);
return result;
});
});
});
return promise;
}
buildPromiseChain(myurls, HttpGet).then((results) => console.log('done', results));