ห่วงโซ่สัญญาเชิงมุมจากอาร์เรย์

ฉันมีอาร์เรย์ของ URL urls = ["/url/file_1", "/url/file_2", "/url/file_3" ... "/url/file_n"] และตัวแปรสตริง str = "" วิธีที่ดีที่สุดในการสร้างห่วงโซ่คำสัญญาเพื่อเติม str ด้วยเนื้อหาของไฟล์ทั้งหมดจาก urls คืออะไร


person Anton    schedule 08.10.2015    source แหล่งที่มา


คำตอบ (3)


คุณควรใช้ $q.all

$q.all(urls.map(function(url){return $http.get(url)})) //create multiple requests and return the array of promises
    .then(function(results){ //an array of results
        results.forEach(function(res){ //response object https://docs.angularjs.org/api/ng/service/$http
            str += res.data; //concat strings assuming that all get calls will return string
        });
    });
person demkalkov    schedule 08.10.2015
comment
โซลูชั่นที่หรูหรามาก! อาจเพิ่มข้อความเพื่ออธิบายสิ่งที่คุณกำลังทำและวิธีการทำงาน - person LionC; 08.10.2015

นั่นเป็นไปได้โดยใช้ $q.all ตัวอย่างการใช้งาน:

var urls = [ /* some urls */ ];
var promises = Array(urls.length);
var results = Array(urls.length);

for(var i = 0; i < urls.length; i++) {
    promises[i] = yourPromiseReturningFunction(urls[i]).then(function(result) {
        results[i] = result;
    });
}

$q.all(promises).then(function() {
    //Just an example, do whatever youw ant with your results here
    console.log(resulst.join('')); 
});

ซึ่งสามารถทำได้ในรูปแบบที่หรูหรายิ่งขึ้น (มีสไตล์การใช้งานมากขึ้น) นี่เป็นเพียงตัวอย่างที่แสดงให้เห็นว่าเป็นไปได้อย่างไร ค้นหาเอกสารประกอบใน $q.all ที่นี่

person LionC    schedule 08.10.2015

ลองบางอย่างเช่น:

var stringResult = '';
promises = [];
angular.forEach(urls, function (url) {
   promises.push($htpp({method: 'GET', url: url}))
}
$q.all(promises).then(
   function () {stringResult = stringResult.concat(res)})
person adriaan_se    schedule 08.10.2015
comment
โปรดทราบว่าการดำเนินการนี้จะเพิ่มผลลัพธ์ตามลำดับแบบสุ่มและไม่อนุญาตให้ตอบสนองต่อคำสัญญาทั้งหมดที่ได้รับการแก้ไข - person LionC; 08.10.2015