JS Promise - instantly retrieve some data from a function that returns a Promise

前端 未结 6 1196
生来不讨喜
生来不讨喜 2021-01-04 20:07

Can anyone recommend a pattern for instantly retrieving data from a function that returns a Promise?

My (simplified) example is an AJAX preloader:

lo         


        
6条回答
  •  失恋的感觉
    2021-01-04 20:57

    You can use fetch(), Response.body.getReader(), where when .read() is called returns a ReadableStream having a cancel method, which returns a Promise upon cancelling read of the stream.

    // 58977 bytes of text, 59175 total bytes
    var url = "https://gist.githubusercontent.com/anonymous/"
              + "2250b78a2ddc80a4de817bbf414b1704/raw/"
              + "4dc10dacc26045f5c48f6d74440213584202f2d2/lorem.txt";
    var n = 10000;
    var clicked = false;
    var button = document.querySelector("button");
    button.addEventListener("click", () => {clicked = true});
    
    fetch(url)
    .then(response => response.body.getReader())
    .then(reader => {
      var len = 0;
      reader.read().then(function processData(result) {
        if (result.done) {
          // do stuff when `reader` is `closed`
          return reader.closed.then(function() {
            return "stream complete"
          });
        };
        if (!clicked) {
          len += result.value.byteLength;
        }
        // cancel stream if `button` clicked or 
        // to bytes processed is greater than 10000
        if (clicked || len > n) {
          return reader.cancel().then(function() {
            return "read aborted at " + len + " bytes"
          })
        }
        console.log("len:", len, "result value:", result.value);
        return reader.read().then(processData)
      })
      .then(function(msg) {
        alert(msg)
      })
      .catch(function(err) {
        console.log("err", err)
      })
    });

提交回复
热议问题