在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML/ promise如何實(shí)現(xiàn)異步遞歸

promise如何實(shí)現(xiàn)異步遞歸

async(data).then(function (data) {
  if (data < 0) return data;
  return async1(data);
}).then(function (data) {
  if (data < 0) return data;  
  return async1(data);
}).then(function (data) {
  return data
})

如上面的代碼,當(dāng)data < 0時(shí)就返回data的值,但是什么時(shí)候返回0我不清楚,也就是return async1(data);執(zhí)行多少次我不清楚,不使用async/await 前提下怎么利用遞歸實(shí)現(xiàn)

回答
編輯回答
終相守
如上面的代碼,當(dāng)data < 0時(shí)就返回data的值

異步?jīng)]有 return , 只有 callback .

2017年10月31日 18:37
編輯回答
念舊

在chrome控制臺(tái)下運(yùn)行

(async ()=>{
    // 模擬每次接受請(qǐng)求都會(huì)被動(dòng)更新?tīng)顟B(tài)
    let counter = 10;
    let async = async ()=>new Promise((resolve, reject)=>{
            setTimeout(()=>{
                resolve(counter--);
            }, Math.random()*500);
        });

    // 模擬主動(dòng)更新自身狀態(tài)
    let counter2 = 10;
    let timer = setInterval(()=>{
        counter2-=1;
        if(counter2 < 0){
            clearInterval(timer);
        }
    }, 1000);
    let async2 = async()=>new Promise((resolve, reject)=>{
        setTimeout(()=>{
            resolve(counter2);
        }, 100); // 假裝這里的操作需要點(diǎn)時(shí)間
    });


    function getSomeData() {
      return new Promise(async function body(resolve, reject) {    
        async().then(data=>{
            console.log(`async() == ${data}`);
            if(data < 0){
                resolve(data);
            }else{
                setTimeout(()=>{
                    body(resolve, reject);
                }, 50); // 避免過(guò)于頻繁的調(diào)用導(dǎo)致UI卡死
            }
        });
      });
    }

    function getSomeData2() {
      return new Promise(async function body(resolve, reject) {    
        async2().then(data=>{
            console.log(`async2() == ${data}`);
            if(data < 0){
                resolve(data);
            }else{
                setTimeout(()=>{
                    body(resolve, reject);
                }, 10); // 避免過(guò)于頻繁的調(diào)用導(dǎo)致UI卡死
            }
        });
      });
    }

    console.log(`Done with async: ${await getSomeData()}`);
    console.log(`Done with async2: ${await getSomeData2()}`);
})();
2017年4月18日 09:16
編輯回答
兮顏

未必要局限于 Promise,比如你可以借助 setInterval。我假設(shè)你這是一個(gè)獨(dú)立的函數(shù),訪問(wèn)后返回一個(gè) Promise,當(dāng)獲取到確切的數(shù)據(jù)時(shí)就返回,沒(méi)有的時(shí)候就不斷重試:

function getSomeData() {
  return new Promise((resovle, rejct) => {    
    let data = null;
    function doAsync() {
      async()
        .then(response => {
          data = response;
        });
    }
    let interval = setInterval(() => {
      if (!isNaN(data) && data >= 0) {
        data = null;
        doAsync();
      } else if (data < 0) {
        clearInterval(interval);
        resolve(data);
      }
    }, 50);
  });
}

不過(guò)最好的方式應(yīng)該是借助 generator:

let generator = function* () {
  let data = null;
  while (data >= 0) {
    yield async()
      .then(response => {
        data = response;
      });
  }
  return data;
};

function getSomeData() {
  let iterator = generator();
  
  function next() {
    let result = iterator.next();
    if (result.done) {
      return result.value;
    }
    let promise = iterator.next().value;
    promise.then(next);
  }
   
  next();
}

getSomeData();
2017年7月16日 15:00