Jak dodać opóźnienie do obietnicy w środku [duplikat]

To pytanie ma już odpowiedź tutaj:

fetch() {   
    return axios.get('/rest/foo')
        //.then(response => {throw new Error(response)}) // Uncomment to test network error
        //.then( <<add delay here>> ) // Uncomment to simulate network delay
}

Jak dodać opóźnienie w tym drugim bloku, tak aby czekało określoną ilość czasu przed przekazaniem kontrolki do wywołujących fetch, a następnie blokuje?

Author: Tuomas Toivonen, 2016-08-15

2 answers

Zwraca obietnicę z then obsługi, która czeka:

.then(() => new Promise(resolve => setTimeout(resolve, 1000)))

Jeśli chcesz "przekazać" wartość obietnicy, to

.then(x => new Promise(resolve => setTimeout(() => resolve(x), 1000)))

Aby uniknąć tego kotła wszędzie, napisz funkcję użytkową:

function sleeper(ms) {
  return function(x) {
    return new Promise(resolve => setTimeout(() => resolve(x), ms));
  };
}

Następnie użyj go jak w

.then(sleeper(1000)).then(...)
 48
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-23 05:08:31

Jest to jedna z rzadkich sytuacji, kiedy tworzysz nową obietnicę:

fetch() {   
    return axios.get('/rest/foo')
        .then(value => new Promise(resolve => {
                setTimeout(() => {
                    resolve(value);
                }, delayInMilliseconds);
            })
        );
}

Jeśli jest to możliwe, że value może być obietnicą, Wstaw .then(value => Promise.resolve(value)) w łańcuchu:

fetch() {   
    return axios.get('/rest/foo')
        .then(value => Promise.resolve(value))     // ***
        .then(value => new Promise(resolve => {
                setTimeout(() => {
                    resolve(value);
                }, delayInMilliseconds);
            })
        );
}
 0
Author: T.J. Crowder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-15 13:59:35