2016-07-06 63 views
0

我有一個執行某些異步工作並返回Promise的函數,我想無限期地執行此函數,直到承諾爲reject ed。無限期循環承諾,直到拒絕爲止

類似以下內容:

doSomethingAsync(). 
    .then(doSomethingAsync) 
    .then(doSomethingAsync) 
    .then(doSomethingAsync) 
    // ... until rejection 

我做了一個小CodePen這樣我就可以測試潛在的解決方案:http://codepen.io/JesmoDrazik/pen/pbAovZ?editors=0011

我發現了幾個可能的答案,但似乎沒有爲我的情況下工作。

如果有人有解決方案,我會很高興,因爲我什麼都找不到!

謝謝。

+0

你setTimeout和你codepen按鈕評論讓我不知道你真正想要的目的。可能的承諾不是你所需要的。點擊一個按鈕不會導致拒絕承諾。 –

回答

3

你可以做

(function loop(){ 
    doSomethingAsync().then(loop); 
})(); 

但看你的筆,目前還不清楚其中的抑制應從何而來。如果你想停止重複的操作,當用戶點擊一個按鈕,就可以在按鈕操作改變的狀態,然後做

(function loop(){ 
    doSomethingAsync().then(function(){ 
      if (!stopped) loop(); 
    }); 
})(); 
1

進行了修改,以你的codepen

var FAKE_COUNT = 0; 

function doSomething() { 
    return new Promise((resolve, reject) => { 
    setTimeout(() => { 
     console.log('doing something async: ' + FAKE_COUNT) 
     if (FAKE_COUNT < 10) { 
     resolve(); 
     } else { 
     reject(); 
     } 
     FAKE_COUNT ++; 
    }, 1000); 
    }); 
} 

const button = document.querySelector('.js-button'); 

button.addEventListener('click',() => { 
    // maybe we can do something here ? 
}) 

function test() { 
    doSomething().then(test).catch(() => { 
    console.log("Rejected") 
    }); 
} 

test(); 

FAKE_COUNT剛剛成爲該標誌,所以如果你想通過點擊而不是點擊來停止諾言,你可以使它成爲一個布爾型,並檢查當執行異步任務時

0

根據你想要在何處發生邏輯和拒絕,但假設你想要公關omise本身是自我執行(否則異步執行本身可以循環)就可以返回自己作爲一個新的承諾:

function doSomething() { 
    return new Promise((resolve, reject) => { 
    setTimeout(() => { 
     console.log('doing something async'); 
     resolve(); 
    }, 1000); 
    }).then(()=>doSomething()); 
} 

對於抑制部分,最簡單的辦法是引入一個標誌,(儘管這使承諾包含少一點自我):

var stop = false; 
function doSomething() { 
    return new Promise((resolve, reject) => { 
    if(stop) 
     reject(); 
    else{ 
     setTimeout(() => { 
     console.log('doing something async'); 
     resolve(); //(check for stop could be done here as well) 
     }, 1000); 
    } 
    }).then(()=>doSomething()); 
} 

const button = document.querySelector('.js-button'); 
button.addEventListener('click',() => { 
    stop = true; 
}); 

doSomething();